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
memoized(method_name)
Alias for: memoize