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

[](arg)
Alias for: get
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