def memoize_method(*method_ids)
method_ids.each do |method_id|
orig_method = instance_method(method_id)
__send__(:define_method, method_id) do |*args|
unless mc = ::Module.__memoize_cache__[__id__]
mc = ::Module.__memoize_cache__[__id__] ||= {}
ObjectSpace.define_finalizer(self, ::Module.__memoize_cache_delete__)
end
if mc.key?(args)
result = mc[args]
else
result = mc[args] = orig_method.bind(self).call(*args)
if $DEBUG
warn "#{self.class} cached method #{method_id}(#{args.inspect unless args.empty?}) = #{result.inspect} [#{__id__}]"
end
end
result
end
end
end