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
|
# File 'lib/mem.rb', line 29
def memoize(method_name)
original_visibility =
case
when protected_instance_methods.include?(method_name)
:protected
when private_instance_methods.include?(method_name)
:private
else
:public
end
define_method("#{method_name}_with_memoize") do |*args, &block|
if has_memoized?(method_name)
memoized(method_name)
else
memoize(method_name, send("#{method_name}_without_memoize", *args, &block))
end
end
send(original_visibility, "#{method_name}_with_memoize")
alias_method "#{method_name}_without_memoize", method_name
alias_method method_name, "#{method_name}_with_memoize"
define_method("unmemoize_#{method_name}") do
unmemoize(method_name)
end
send(original_visibility, "unmemoize_#{method_name}")
if original_visibility != :private
define_method("#{method_name}=") do |value|
memoize(method_name, value)
end
send(original_visibility, "#{method_name}=")
end
end
|