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
|
# File 'lib/is/monkey/properties.rb', line 18
def property *args, &block
@properties ||= {}
if Hash === args[-1]
opts = args.pop
else
opts = {}
end
init = opts[:init]
default = opts[:default]
validator = opts[:validator]
valclass = opts[:class]
valnull = opts[:null]
inh = opts[:inheritance]
args.each do |a|
getter = a.intern
attr_accessor getter
variable = "@#{getter}".intern
setter = "#{getter}=".intern
get_proc = define_method getter do |*values|
if ! instance_variable_defined?(variable)
instance_variable_set variable,
singleton_class.properties[getter].default(self)
end
value = instance_variable_get variable
if ! values.empty?
if value.respond_to? :append!
value.append! *values
elsif values.size == 1
value = values[0]
else
value = values
end
send setter, value
end
result = instance_variable_get variable
if inh && Class === self && superclass && superclass.respond_to?(getter)
sup = superclass.send getter
if sup.respond_to? :append
result = sup.append result
end
end
result
end
if block_given?
set_proc = define_method setter, &block
else
set_proc = define_method setter do |value|
if validator && !(validator === value || valnull && value == nil)
raise 'Invalid property value!'
elsif valclass && !(valclass === value || valnull && value == nil)
raise 'Invalid property value class!'
end
instance_variable_set variable, value
end
end
@properties[getter] = Is::Property.new self, getter,
opts.merge(:getter => get_proc, :setter => set_proc)
end
end
|