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