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