class AnotherEnum
Provide support for defining enumerated types.
Example
class Colour < AnotherEnum define :red do # ... end define :green do # ... end define :blue do # ... end end
Public Class Methods
all()
click to toggle source
# File lib/another_enum.rb, line 80 def all @all_by_code.values end
codes()
click to toggle source
# File lib/another_enum.rb, line 84 def codes @all_by_code.keys end
define(code, &block)
click to toggle source
Public: Declare a enumerated value.
code - a unique (String) code that identifies this value block - optional block defines behaviour specific to this value
Example
class Colour < AnotherEnum; end Colour.define :red do def rgb "#ff0000" end end
# File lib/another_enum.rb, line 44 def define(code, &block) code = code.to_sym.to_s value = generate_value(code, &block) register_value(code, value) end
fetch(code)
click to toggle source
# File lib/another_enum.rb, line 76 def fetch(code) get(code) || raise(ArgumentError, "no such #{self}: #{code.inspect}") end
get(arg)
click to toggle source
# File lib/another_enum.rb, line 69 def get(arg) return arg if self === arg @all_by_code[arg.to_s] end
Also aliased as: []
hardcode(attributes)
click to toggle source
Public: Succintly declare methods to return hardcoded values.
attributes - a Hash; a method will be generated for each key, returning
the corresponding value
Example
Colour.define :red do hardcode :rgb => "#ff0000" end
# File lib/another_enum.rb, line 63 def hardcode(attributes) attributes.each do |name, value| define_method(name) { value } end end
Private Class Methods
generate_value(code, &block)
click to toggle source
# File lib/another_enum.rb, line 90 def generate_value(code, &block) new.tap do |value| value.singleton_class.class_eval do define_method(:code) { code } define_method("#{code}?") { true } class_eval(&block) if block end end end
register_value(code, value)
click to toggle source
# File lib/another_enum.rb, line 100 def register_value(code, value) singleton_class.send(:define_method, code) { value } # e.g. Brand.hooroo class_eval "def #{code}?; false; end" # e.g. other_brand.hooroo? @all_by_code ||= {} @all_by_code[code] = value end
Public Instance Methods
inspect()
click to toggle source
# File lib/another_enum.rb, line 113 def inspect "#{self.class}.#{code}" end
to_s()
click to toggle source
# File lib/another_enum.rb, line 109 def to_s code end