class Enum

Constants

VERSION

Attributes

by_name[R]
by_value[R]
klass[R]
name[R]

Public Class Methods

new(name, klass=nil, hash={}) click to toggle source
# File lib/enum.rb, line 7
def initialize(name, klass=nil, hash={})
  klass, hash = nil, klass unless klass.is_a?(Module)
  @name, @klass = name, klass
  map_hash(hash)
  generate_methods
end

Public Instance Methods

[](*name_or_values) click to toggle source
# File lib/enum.rb, line 31
def [](*name_or_values)
  return name_or_values.map { |name_or_value| get(name_or_value) } if name_or_values.length > 1

  name_or_value = name_or_values.first
  get(name_or_value) or raise "#{inspect} does not know #{name_or_value.inspect}"
end
each(&block) click to toggle source
# File lib/enum.rb, line 27
def each(&block)
  @by_name.each_value(&block)
end
get(*name_or_values) click to toggle source
# File lib/enum.rb, line 38
def get(*name_or_values)
  return name_or_values.map { |name_or_value| get(name_or_value) } if name_or_values.length > 1

  name_or_value = name_or_values.first
  @by_name_s[name_or_value.to_s] || @by_value_s[name_or_value.to_s]
end
inspect() click to toggle source
# File lib/enum.rb, line 17
def inspect
  "#{to_s}(#{@by_name.map { |n, ev| "#{n.inspect} => #{ev.value.inspect}"}.join(", ")})"
end
names() click to toggle source
# File lib/enum.rb, line 21
def names
  @by_name.keys
end
options() click to toggle source
# File lib/enum.rb, line 45
def options
  Hash[map { |ev| [ev.t, ev] }]
end
to_s() click to toggle source
# File lib/enum.rb, line 14
def to_s
  @klass ? "#{@klass.name}::#{@name}" : @name.to_s
end
values() click to toggle source
# File lib/enum.rb, line 24
def values
  @by_value.keys
end

Private Instance Methods

generate_methods() click to toggle source
# File lib/enum.rb, line 66
def generate_methods
  names.each do |name|
    define_singleton_method(name) { self[name] }
  end
end
map_hash(hash) click to toggle source
# File lib/enum.rb, line 50
def map_hash(hash)
  hash = Hash[hash.map { |n| [n, n.to_s] }] if hash.is_a?(Array)
  @by_name = {}
  @by_value = {}
  @by_name_s = {}
  @by_value_s = {}
  hash.each do |n, v|
    n, v = v, n if v.is_a?(Symbol) and not n.is_a?(Symbol)
    raise "duplicate enum name #{n} for #{to_s}" if @by_name.has_key?(n)
    raise "duplicate enum value #{v} for #{to_s}.#{n}" if @by_value.has_key?(v)
    raise "value can't be nil for #{to_s}.#{n}" if v.nil?
    @by_name_s[n.to_s] = @by_value_s[v.to_s] = @by_name[n] = @by_value[v] = EnumValue.new(self, n, v)
  end
  @by_name.freeze
  @by_value.freeze
end