rails / rails

Ruby on Rails

This URL has Read+Write access

rails / activesupport / lib / active_support / memoizable.rb
8a9934a9 » josh 2008-07-14 Added Memoizable mixin for ... Comment 1 module ActiveSupport
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 2 module Memoizable
3 module Freezable
4 def self.included(base)
5 base.class_eval do
6 unless base.method_defined?(:freeze_without_memoizable)
7 alias_method_chain :freeze, :memoizable
8 end
9 end
10 end
11
12 def freeze_with_memoizable
13 methods.each do |method|
ae6105ef » jeremy 2008-07-27 Don't rememoize if already ... 14 __send__($1) if method.to_s =~ /^_unmemoized_(.*)/
15 end unless frozen?
16
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 17 freeze_without_memoizable
18 end
19 end
20
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 21 def memoize(*symbols)
22 symbols.each do |symbol|
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 23 original_method = "_unmemoized_#{symbol}"
24 memoized_ivar = "@_memoized_#{symbol}"
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 25
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 26 class_eval <<-EOS, __FILE__, __LINE__
27 include Freezable
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 28
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 29 raise "Already memoized #{symbol}" if method_defined?(:#{original_method})
30 alias #{original_method} #{symbol}
31
32 def #{symbol}(*args)
33 #{memoized_ivar} ||= {}
34 reload = args.pop if args.last == true || args.last == :reload
c609be45 » josh 2008-07-18 Ruby 1.9: Ensure Memoizable... 35
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 36 if !reload && #{memoized_ivar} && #{memoized_ivar}.has_key?(args)
37 #{memoized_ivar}[args]
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 38 else
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 39 #{memoized_ivar}[args] = #{original_method}(*args).freeze
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 40 end
41 end
42 EOS
8a9934a9 » josh 2008-07-14 Added Memoizable mixin for ... Comment 43 end
44 end
45 end
46 end