lib/renum/enumerated_value.rb in renum-1.2.0 vs lib/renum/enumerated_value.rb in renum-1.3.1

- old
+ new

@@ -1,47 +1,57 @@ require 'forwardable' module Renum # This is the superclass of all enumeration classes. - # An enumeration class is Enumerable over its values and also delegates [] - # to the values array. + # An enumeration class is Enumerable over its values and exposes them by numeric index via []. # Values are also comparable, sorting into the order in which they're declared. class EnumeratedValue - + class << self include Enumerable extend Forwardable - + def_delegators :values, :each, :[] - + # Returns an array of values in the order they're declared. def values @values ||= [] end - + + def with_name name + values_by_name[name] + end + + def values_by_name + @values_by_name ||= values.inject({}) do |memo, value| + memo[value.name] = value + memo + end.freeze + end + end - + include Comparable - attr_reader :name - attr_reader :index - + + attr_reader :name, :index + def initialize name - @name = name.to_s + @name = name.to_s.freeze @index = self.class.values.size self.class.values << self end - - # Returns the fully qualified constant referring to this value. + + # Returns the fully qualified name of the constant referring to this value. # Don't override this if you're using Renum with the constantize_attribute # plugin, which relies on this behavior. def to_s "#{self.class}::#{name}" end - + # Sorts enumerated values into the order in which they're declared. def <=> other index <=> other.index end - + end -end \ No newline at end of file +end