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
|
# File 'lib/attr_callback.rb', line 19
def define_callback_on_class(klass, name, options={})
name = name.to_sym
locking = options[:lock].nil? ? true : options[:lock]
noop = options[:noop].nil? ? true : options[:noop]
if locking
klass.__send__(:define_method, "#{name}=") do |value|
AttrCallback::Util.get_or_create_mutex(self, name).synchronize {
instance_variable_set("@#{name}", value)
}
end
else
klass.__send__(:attr_writer, name)
end
klass.__send__(:define_method, name) do |*args, &block|
raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?
if block.nil?
if locking
callback = AttrCallback::Util.get_or_create_mutex(self, name).synchronize { instance_variable_get("@#{name}") }
else
callback = instance_variable_get("@#{name}")
end
if noop and callback.nil?
NoopProc
else
callback
end
else
__send__("#{name}=", block)
end
end
end
|