Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. module Memoizable
  2. # Usage:
  3. #
  4. # class Foo
  5. # extend Memoizable
  6. #
  7. # memoize def bar
  8. # 'bar'
  9. # end
  10. # end
  11.  
  12. def memoize(method_name)
  13. if interceptor.instance_variable_defined?(:"@memoized_#{method_name}")
  14. raise "The method :#{method_name} has already been memoized."
  15. end
  16.  
  17. interceptor.send(:define_method, method_name) do |*args, &block|
  18. if instance_variable_defined?(:"@memoized_#{method_name}")
  19. return instance_variable_get(:"@memoized_#{method_name}")
  20. end
  21.  
  22. instance_variable_set(:"@memoized_#{method_name}", super(*args, &block))
  23. end
  24. end
  25.  
  26. private
  27.  
  28. def interceptor
  29. existing_interceptor || create_interceptor
  30. end
  31.  
  32. def interceptor_name
  33. 'MemoizeInterceptor'
  34. end
  35.  
  36. def existing_interceptor
  37. const_get(interceptor_name) if const_defined?(interceptor_name)
  38. end
  39.  
  40. def create_interceptor
  41. prepend(const_set(interceptor_name, Module.new))
  42. end
  43. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement