diff options
author | Joshua Peek <josh@joshpeek.com> | 2008-07-18 11:18:16 -0500 |
---|---|---|
committer | Joshua Peek <josh@joshpeek.com> | 2008-07-18 11:19:38 -0500 |
commit | e1f23da53cef20a60e4bf458d959fe2bfe7d52ea (patch) | |
tree | 97753d4e40ef08da5c0827b51e03a4e7f5c8c276 /activesupport/lib | |
parent | 7430c4168fad07b480dbf80c8ac75ba7db8c634f (diff) | |
download | rails-e1f23da53cef20a60e4bf458d959fe2bfe7d52ea.tar.gz rails-e1f23da53cef20a60e4bf458d959fe2bfe7d52ea.tar.bz2 rails-e1f23da53cef20a60e4bf458d959fe2bfe7d52ea.zip |
Allow memoized methods to be reloaded and allow multiple symbols
Diffstat (limited to 'activesupport/lib')
-rw-r--r-- | activesupport/lib/active_support/memoizable.rb | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/activesupport/lib/active_support/memoizable.rb b/activesupport/lib/active_support/memoizable.rb index d06250171a..c41feef4c7 100644 --- a/activesupport/lib/active_support/memoizable.rb +++ b/activesupport/lib/active_support/memoizable.rb @@ -5,28 +5,30 @@ module ActiveSupport end module ClassMethods - def memoize(symbol) - original_method = "_unmemoized_#{symbol}" - memoized_ivar = "@_memoized_#{symbol}" - raise "Already memoized #{symbol}" if instance_methods.map(&:to_s).include?(original_method) + def memoize(*symbols) + symbols.each do |symbol| + original_method = "unmemoized_#{symbol}" + memoized_ivar = "@#{symbol}" + raise "Already memoized #{symbol}" if instance_methods.map(&:to_s).include?(original_method) - alias_method original_method, symbol - class_eval <<-EOS, __FILE__, __LINE__ - def #{symbol} - if defined? #{memoized_ivar} - #{memoized_ivar} - else - #{memoized_ivar} = #{original_method} + alias_method original_method, symbol + class_eval <<-EOS, __FILE__, __LINE__ + def #{symbol}(reload = false) + if !reload && defined? #{memoized_ivar} + #{memoized_ivar} + else + #{memoized_ivar} = #{original_method}.freeze + end end - end - EOS + EOS + end end end def freeze methods.each do |method| - if m = method.to_s.match(/\A_unmemoized_(.*)/) - send(m[1]).freeze + if m = method.to_s.match(/\Aunmemoized_(.*)/) + send(m[1]) end end super |