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. 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 |