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
|
# File 'lib/platanus/enum.rb', line 47
def attr_enum(_target, _module, _options={})
map = {}
pname = _options.has_key?(:property_name) ? _options[:property_name] : (_target.to_s + '_str')
_module.constants.each { |cname| map[_module.const_get(cname)] = cname.to_s.downcase }
self.send(:define_method, pname) do
map.fetch(self.send(_target), '')
end
self.send(:define_method, pname + '=') do |value|
map.each_pair do |k,v|
if v == value
self.send(_target.to_s + '=', k)
return
end
end
raise InvalidEnumName
end
klass = class << self; self; end
klass.send(:define_method, 'parse_' + _target.to_s) do |value|
value = value.to_s
map.each_pair do |k,v|
return k if v == value
end
return nil
end
self.validates _target, inclusion: { :in => map.keys } if _options.fetch(:validate, true)
end
|