module RubyEnum::ClassMethods
Public Instance Methods
[](name)
click to toggle source
@return the enumeration instance with the specified name or nil if none exists
# File lib/ruby_enum.rb, line 85 def [](name) _enumeration_values[_normalize(name)] end
all()
click to toggle source
@return [Array] all enumeration instances defined in this enumeration class
# File lib/ruby_enum.rb, line 90 def all _enumeration_values.map { |_, instance| instance } end
enum(name, value = nil)
click to toggle source
# File lib/ruby_enum.rb, line 64 def enum(name, value = nil) raise ArgumentError, 'name is required for an enumeration' if name.nil? normalized_name = _normalize name if self[normalized_name] raise ArgumentError, "an enumeration value for #{normalized_name} has " \ "already been defined in #{self.name}." else value = normalized_name.to_s unless value if find_by_value value raise ArgumentError, "duplicate associated value `#{value}` for enumeration" \ "with name `#{name}`" end _define_instance_accessor_for normalized_name _enumeration_values[normalized_name] = new(normalized_name, value) const_set normalized_name.to_s.upcase, _enumeration_values[normalized_name] end end
find_by_value(value)
click to toggle source
@return the enumeration instance with the specifed associated value
# File lib/ruby_enum.rb, line 106 def find_by_value(value) all.find { |instance| instance.value == value } end
find_by_value!(value)
click to toggle source
@return the enumeration instance with the specified associated value @raise [ArgumentError] when no enumeration instance with the associated value is found
# File lib/ruby_enum.rb, line 96 def find_by_value!(value) result = find_by_value(value) unless result raise ArgumentError, "No enumeration value with associated value #{value} found" end result end
Private Instance Methods
_define_instance_accessor_for(name)
click to toggle source
# File lib/ruby_enum.rb, line 116 def _define_instance_accessor_for(name) # check {http://ryanangilly.com/post/234897271/dynamically-adding-class-methods-in-ruby} _metaclass.instance_eval do define_method(name) { return self[name] } end end
_enumeration_values()
click to toggle source
# File lib/ruby_enum.rb, line 112 def _enumeration_values @_instances ||= {} end
_metaclass()
click to toggle source
# File lib/ruby_enum.rb, line 123 def _metaclass class << self self end end
_normalize(name)
click to toggle source
# File lib/ruby_enum.rb, line 129 def _normalize(name) name.to_s.downcase.to_sym end