What Module#prepend allows us to do is insert a module
in-front of the class it was prepended to:
module Before end class Example prepend Before end Example.ancestors # => [Before, Example, Object, Kernel, BasicObject]
module Memoize
def memoize(method)
memoizer = Module.new do
# Define a method in the module with the same name
define_method method do
@__memoized_results ||= {}
if @__memoized_results.include? method
@__memoized_results[method]
else
@__memoized_results[method] = super()
end
end
end
prepend memoizer
end
end