64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/ddmemoize.rb', line 64
def memoize(method_name)
original_method_name = '__nonmemoized_' + method_name.to_s
alias_method original_method_name, method_name
instance_cache = Hash.new { |hash, key| hash[key] = {} }
full_method_name = "#{self}##{method_name}"
define_method(method_name) do |*args|
instance_method_cache = instance_cache[self]
value = NONE
if instance_method_cache.key?(args)
object = instance_method_cache[args].object
value = object ? object.value : NONE
end
if DDMemoize.metrics_enabled?
if NONE.equal?(value)
DDMemoize.metrics_counter.increment(method: full_method_name, type: :miss)
else
DDMemoize.metrics_counter.increment(method: full_method_name, type: :hit)
end
end
if value.equal?(NONE)
send(original_method_name, *args).tap do |r|
instance_method_cache[args] = Ref::SoftReference.new(Value.new(r))
end
else
value
end
end
end
|