module DDMemoize::Mixin
Public Instance Methods
memoize(method_name)
click to toggle source
# 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
Also aliased as: memoized