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