Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.84 KB | None | 0 0
  1. # app/models/concerns/memoizable.rb
  2. module Memoizable
  3. extend ActiveSupport::Concern
  4.  
  5. class_methods do
  6. def memoize(*method_names)
  7. method_names.each do |method_name|
  8. memoized_ivar = "@_memoized_#{method_name.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
  9. memoized_module = Module.new do
  10. module_eval <<-EVAL
  11. def #{method_name}
  12. unless #{memoized_ivar}
  13. #{memoized_ivar} = [super]
  14. end
  15. #{memoized_ivar}[0]
  16. end
  17.  
  18. def reload
  19. #{memoized_ivar} = nil
  20. super
  21. end
  22.  
  23. def self.to_s
  24. "Memoizable::MemoizedMethod(#{method_name})"
  25. end
  26.  
  27. def self.inspect; to_s; end
  28. EVAL
  29. end
  30. prepend memoized_module
  31. end
  32. end
  33. end
  34. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement