2
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
|
# File 'lib/tins/annotate.rb', line 2
def annotate(name)
singleton_class.class_eval do
define_method(name) do |annotation = :annotated|
instance_variable_set "@__annotation_#{name}__", annotation
end
define_method("#{name}_of") do |method_name|
__send__("#{name}_annotations")[method_name]
end
define_method("#{name}_annotations") do
if instance_variable_defined?("@__annotation_#{name}_annotations__")
instance_variable_get "@__annotation_#{name}_annotations__"
else
instance_variable_set "@__annotation_#{name}_annotations__", {}
end
end
old_method_added = instance_method(:method_added)
define_method(:method_added) do |method_name|
old_method_added.bind(self).call method_name
if annotation = instance_variable_get("@__annotation_#{name}__")
__send__("#{name}_annotations")[method_name] = annotation
end
instance_variable_set "@__annotation_#{name}__", nil
end
end
define_method("#{name}_annotations") do
self.class.__send__("#{name}_annotations")
end
define_method("#{name}_of") do |method_name|
self.class.__send__("#{name}_of", method_name)
end
end
|