Top Level Namespace

Instance Method Summary collapse

Instance Method Details

#NamedValueClass(klass_name, superclass, &block) ⇒ Object



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"