Module: DDMemoize::Mixin

Defined in:
lib/ddmemoize.rb

Instance Method Summary collapse

Instance Method Details

#memoize(method_name) ⇒ Object Also known as: memoized



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