class EnumField::Builder

Public Class Methods

new(target) click to toggle source
# File lib/enum_field/builder.rb, line 3
def initialize(target)
  @target = target
  @next_id = 0
  @id2obj = {}
  @name2obj = {}
  @sorted = []
end

Public Instance Methods

all() click to toggle source
# File lib/enum_field/builder.rb, line 19
def all
  @sorted.dup
end
find(id) click to toggle source
# File lib/enum_field/builder.rb, line 27
def find(id)
  find_by_id(id) or raise EnumField::ObjectNotFound
end
find_by_id(id) click to toggle source
# File lib/enum_field/builder.rb, line 31
def find_by_id(id)
  @id2obj[id.to_i]
end
first() click to toggle source
# File lib/enum_field/builder.rb, line 35
def first; @sorted.first; end
last() click to toggle source
# File lib/enum_field/builder.rb, line 36
def last; @sorted.last; end
member(name, options = {}) click to toggle source
# File lib/enum_field/builder.rb, line 11
def member(name, options = {})
  obj, candidate_id = process_options(options)
  assign_id(obj, candidate_id)
  define_in_meta(name) { obj }
  save(name, obj)
  obj.freeze
end
names() click to toggle source
# File lib/enum_field/builder.rb, line 23
def names
  @name2obj.keys
end

Private Instance Methods

assign_id(obj, candidate_id) click to toggle source
# File lib/enum_field/builder.rb, line 45
def assign_id(obj, candidate_id)
  id = new_id(candidate_id)
  obj.class.send(:attr_reader, :id)
  obj.instance_variable_set(:@id, id)
end
define_in_meta(name, &block) click to toggle source
# File lib/enum_field/builder.rb, line 40
def define_in_meta(name, &block)
  metaclass = class << @target; self; end
  metaclass.send(:define_method, name, &block)
end
find_next_id() click to toggle source
# File lib/enum_field/builder.rb, line 61
def find_next_id
  @next_id += 1 while @id2obj.has_key?(@next_id) || @next_id <= 0
  @next_id
end
new_id(candidate) click to toggle source
# File lib/enum_field/builder.rb, line 51
def new_id(candidate)
  validate_candidate_id(candidate)
  candidate || find_next_id
end
process_options(options) click to toggle source
# File lib/enum_field/builder.rb, line 66
def process_options(options)
  raise EnumField::InvalidOptions unless options.reject {|k,v| k == :object || k == :id}.empty?
  [options[:object] || @target.new, options[:id]]
end
save(name, obj) click to toggle source
# File lib/enum_field/builder.rb, line 71
def save(name, obj)
  @id2obj[obj.id] = obj
  @sorted << obj
  @name2obj[name] = obj
end
validate_candidate_id(id) click to toggle source
# File lib/enum_field/builder.rb, line 56
def validate_candidate_id(id)
  raise EnumField::InvalidId.new(id) unless id.nil? || id.is_a?(Integer) && id > 0
  raise EnumField::RepeatedId.new(id) if @id2obj.has_key?(id)
end