3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/named_value_class.rb', line 3
def NamedValueClass(klass_name,superclass, &block)
target = (self.class == Object ? Kernel : self)
target.module_eval "class #{klass_name} < DelegateClass(superclass); end"
klass = target.const_get(klass_name)
klass.module_eval do
def initialize(name,value,attrs = {})
@name = name.to_s
super(value)
attrs.each do |(attr,val)|
self.class.instance_eval do
attr_accessor attr
end
instance_variable_set "@#{attr}", val
end
named_values_module = self.class.const_get('NamedValues')
named_values_collection = named_values_module.const_get('Collection')
begin
self.class.const_set(@name, self)
named_values_module.const_set(@name, self)
rescue NameError
name_error_name = "NameError_#{@name}"
begin
self.class.const_get(name_error_name)
rescue NameError
self.class.const_set(name_error_name, self)
named_values_module.const_set(name_error_name, self)
self.class.class_eval " def self.\#{@name}()\n \#{name_error_name}\n end\n EVAL\n named_values_module.module_eval <<-EVAL\n def self.\#{@name}()\n \#{name_error_name}\n end\n def \#{@name}()\n \#{name_error_name}\n end\n EVAL\n end\n end\n \n this = self\n self.class.singleton_class.instance_eval do\n @mapping ||= {}\n @mapping[value] = this unless @mapping[value]\n end\n \n named_values_collection << self\n end\n \n def to_s # :nodoc:\n @name\n end\n \n def value_to_s # :nodoc:\n method_missing :to_s\n end\n \n def inspect # :nodoc:\n @name\n end\n \n def value_inspect # :nodoc:\n method_missing :inspect\n end\n \n def self.[](value)\n singleton_class.instance_eval do\n @mapping[value]\n end\n end\n \n class_eval(&block) if block\n end\n \n klass.class_eval <<-EVAL\n module NamedValues\n Collection = []\n end\n EVAL\n \n define_singleton_method klass_name do |name,value,attrs={}| \n begin\n klass.const_get(name) || klass.const_get(\"NameError_\#{name}\")\n rescue NameError #=> e\n klass.new(name,value,attrs)\n end\n end\n \n klass\nend\n"
|