Class: NumberedList

Inherits:
Object
  • Object
show all
Defined in:
lib/numbered_list.rb

Defined Under Namespace

Classes: BadType, DuplicateKey, ItemValue, MarshallBase

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name) ⇒ NumberedList

Returns a new instance of NumberedList.



81
82
83
84
85
86
# File 'lib/numbered_list.rb', line 81

def initialize(name)
  if !self.class.types.include?(name.to_s.upcase)
    raise BadType, "'#{name}' Class #{name.class} is not a valid #{self.class.to_s}"
  end
  @item = self.class.find_item(name.to_s)
end

Instance Attribute Details

#itemObject (readonly)

Returns the value of attribute item.



4
5
6
# File 'lib/numbered_list.rb', line 4

def item
  @item
end

Class Method Details

.add_item(item) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/numbered_list.rb', line 37

def self.add_item(item)

  if list.has_key?(item.name)
    raise DuplicateKey, "The key #{item.name} has already been registered."
  end
  @items ||= {}
  @items[item.name] = item
end

.add_item_builder(item) ⇒ Object



46
47
48
49
50
51
# File 'lib/numbered_list.rb', line 46

def self.add_item_builder(item)

  self.define_singleton_method(item.builder_method_name) do
    self.new(item.name)
  end
end

.add_item_query(item) ⇒ Object



53
54
55
56
57
# File 'lib/numbered_list.rb', line 53

def self.add_item_query(item)
  define_method(item.query_method_name) do
    name == item.name
  end
end

.add_marshall_classObject



71
72
73
74
75
76
77
78
79
# File 'lib/numbered_list.rb', line 71

def self.add_marshall_class
  klass = self.const_set("Marshall", Class.new(NumberedList::MarshallBase))
  original_class = self
  klass.class_eval do
    define_method(:value_class) do
      return original_class
    end
  end
end

.as_objsObject



98
99
100
# File 'lib/numbered_list.rb', line 98

def self.as_objs
  self.types.collect {|t| self.new(t)}
end

.description(label) ⇒ Object



94
95
96
# File 'lib/numbered_list.rb', line 94

def self.description(label)
  find_item(label).description
end

.find_item(key) ⇒ Object



89
90
91
# File 'lib/numbered_list.rb', line 89

def self.find_item(key)
  list && list.has_key?(key) ? list[key] : raise(BadType, "Unable to find the #{key}/#{key.class} for #{self.to_s} #{self.types} NumberedItem")
end

.item(item_values) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/numbered_list.rb', line 59

def self.item(item_values)

  item = NumberedList::ItemValue.with(item_values)

  add_item(item)
  add_item_builder(item)
  add_item_query(item)
  class_exists = "#{self}::Marshall".constantize rescue nil #https://stackoverflow.com/a/32869926

  add_marshall_class unless class_exists
end

.listObject



33
34
35
# File 'lib/numbered_list.rb', line 33

def self.list
  @items || {}
end

.reset_list!Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/numbered_list.rb', line 14

def self.reset_list!

  list.values.each do |item|

    if respond_to?(item.builder_method_name)

      (
      class << self;
        self;
      end).send(:remove_method, item.builder_method_name)

    end #https://www.ruby-forum.com/topic/116025
    if respond_to?(item.query_method_name)
      remove_method item.query_method_name
    end
  end
  @items = {}
end

.typesObject



114
115
116
117
# File 'lib/numbered_list.rb', line 114

def self.types
  list.keys

end

Instance Method Details

#==(other) ⇒ Object



102
103
104
# File 'lib/numbered_list.rb', line 102

def ==(other)
  other.to_s == self.to_s
end

#to_sObject



106
107
108
# File 'lib/numbered_list.rb', line 106

def to_s
  name
end

#to_strObject



110
111
112
# File 'lib/numbered_list.rb', line 110

def to_str
  to_s
end