Memoize expensive methods
Ruby
module Memoizable
def memoize(method_name)
original = instance_method(method_name)
cache = {}
define_method(method_name) do |*args|
cache[args] ||= original.bind(self).call(*args)
end
end
end
class Report
extend Memoizable
def totals
sleep 2 # pretend this is expensive
{ revenue: 42_000, costs: 17_500 }
end
memoize :totals
end