Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Memoizable
- # Usage:
- #
- # class Foo
- # extend Memoizable
- #
- # memoize def bar
- # 'bar'
- # end
- # end
- def memoize(method_name)
- if interceptor.instance_variable_defined?(:"@memoized_#{method_name}")
- raise "The method :#{method_name} has already been memoized."
- end
- interceptor.send(:define_method, method_name) do |*args, &block|
- if instance_variable_defined?(:"@memoized_#{method_name}")
- return instance_variable_get(:"@memoized_#{method_name}")
- end
- instance_variable_set(:"@memoized_#{method_name}", super(*args, &block))
- end
- end
- private
- def interceptor
- existing_interceptor || create_interceptor
- end
- def interceptor_name
- 'MemoizeInterceptor'
- end
- def existing_interceptor
- const_get(interceptor_name) if const_defined?(interceptor_name)
- end
- def create_interceptor
- prepend(const_set(interceptor_name, Module.new))
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement