aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2008-07-18 11:18:16 -0500
committerJoshua Peek <josh@joshpeek.com>2008-07-18 11:19:38 -0500
commite1f23da53cef20a60e4bf458d959fe2bfe7d52ea (patch)
tree97753d4e40ef08da5c0827b51e03a4e7f5c8c276 /activesupport/lib
parent7430c4168fad07b480dbf80c8ac75ba7db8c634f (diff)
downloadrails-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.rb32
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