Method: Module#memoize_method

Defined in:
lib/tins/memoize.rb

#memoize_method(*method_ids) ⇒ Object

Automatically memoize calls of the the methods method_ids. The memoized results do NOT ONLY depend on the arguments, but ALSO on the object the method is called on.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/tins/memoize.rb', line 36

def memoize_method(*method_ids)
  method_ids.extend(ExtractLastArgumentOptions)
  method_ids, opts = method_ids.extract_last_argument_options
  include CacheMethods
  method_ids.each do |method_id|
    method_id = method_id.to_s.to_sym
    memoize_apply_visibility method_id do
      orig_method = instance_method(method_id)
      __send__(:define_method, method_id) do |*args|
        mc = __memoize_cache__
        if mc.key?(method_id) and result = mc[method_id][args]
          result
        else
          (mc[method_id] ||= {})[args] = result = orig_method.bind(self).call(*args)
          $DEBUG and warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
          opts[:freeze] and result.freeze
        end
        result
      end
    end
  end
  method_ids.size == 1 ? method_ids.first : method_ids
end