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
|
# File 'lib/tagful.rb', line 17
def tagful(method_id, error_module_or_class = nil)
visibility =
case
when public_method_defined?(method_id)
:public
when protected_method_defined?(method_id)
:protected
when private_method_defined?(method_id)
:private
else
raise ::Tagful::NoMethod
end
if error_module_or_class.nil?
if @tagful_error_module_or_class.is_a?(Class)
error_class = @tagful_error_module_or_class
else
error_module = @tagful_error_module_or_class
error_module ||= DEFAULT_ERROR_MODULE_NAME
end
else
if error_module_or_class.is_a?(Class)
error_class = error_module_or_class
else
error_module = error_module_or_class
end
end
if error_class.nil? && error_module == DEFAULT_ERROR_MODULE_NAME
error_module = class_eval(<<-CODE)
unless defined?(#{error_module})
module #{error_module}; end
end
#{error_module}
CODE
end
tagful_methods_module = class_eval('module TagfulMethods; self; end')
tagful_methods_module.module_eval do
if error_class
define_method(method_id) do |*args, &block|
begin
super(*args, &block)
rescue => e
raise error_class, e.message
end
end
else
define_method(method_id) do |*args, &block|
begin
super(*args, &block)
rescue => e
e.extend(error_module) and raise
end
end
end
send visibility, method_id
end
class_eval { prepend(tagful_methods_module) }
method_id
end
|