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