public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
rails / activesupport / lib / active_support / memoizable.rb
f28bd955 » jeremy 2009-04-22 Fix dependencies revealed b... 1 require 'active_support/core_ext/object/metaclass'
5dd29c46 » jeremy 2009-05-13 Cherry-picking Active Suppo... 2 require 'active_support/core_ext/module/aliasing'
f28bd955 » jeremy 2009-04-22 Fix dependencies revealed b... 3
8a9934a9 » josh 2008-07-14 Added Memoizable mixin for ... Comment 4 module ActiveSupport
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 5 module Memoizable
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 6 def self.memoized_ivar_for(symbol)
8603813a » libc 2008-10-05 Fix memoize_all for methods... Comment 7 "@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
8 end
9
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 10 module InstanceMethods
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 11 def self.included(base)
12 base.class_eval do
13 unless base.method_defined?(:freeze_without_memoizable)
14 alias_method_chain :freeze, :memoizable
15 end
16 end
17 end
18
19 def freeze_with_memoizable
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 20 memoize_all unless frozen?
21 freeze_without_memoizable
22 end
23
24 def memoize_all
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 25 prime_cache ".*"
26 end
27
28 def unmemoize_all
29 flush_cache ".*"
30 end
31
32 def prime_cache(*syms)
33 syms.each do |sym|
34 methods.each do |m|
35 if m.to_s =~ /^_unmemoized_(#{sym})/
36 if method(m).arity == 0
37 __send__($1)
38 else
39 ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
40 instance_variable_set(ivar, {})
41 end
a8057669 » jeremy 2008-08-07 Fixed memoize with punctuat... 42 end
43 end
44 end
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 45 end
ae6105ef » jeremy 2008-07-27 Don't rememoize if already ... 46
d48ebead » jpignata 2009-09-04 Escaping symbol passed into... 47 def flush_cache(*syms)
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 48 syms.each do |sym|
e4ceea37 » jeem 2009-08-09 make private_and_public_met... 49 (methods + private_methods + protected_methods).each do |m|
d48ebead » jpignata 2009-09-04 Escaping symbol passed into... 50 if m.to_s =~ /^_unmemoized_(#{sym.to_s.gsub(/\?\Z/, '\?')})/
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 51 ivar = ActiveSupport::Memoizable.memoized_ivar_for($1)
52 instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
53 end
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 54 end
55 end
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 56 end
57 end
58
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 59 def memoize(*symbols)
60 symbols.each do |symbol|
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 61 original_method = :"_unmemoized_#{symbol}"
761a633a » josh 2008-12-03 Add Memoizable#flush_cache ... 62 memoized_ivar = ActiveSupport::Memoizable.memoized_ivar_for(symbol)
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 63
eb9af20b » wycats 2009-01-22 Begin unifying the interfac... 64 class_eval <<-EOS, __FILE__, __LINE__ + 1
a2270ef2 » fxn 2008-12-28 Inline code comments for cl... Comment 65 include InstanceMethods # include InstanceMethods
66 #
67 if method_defined?(:#{original_method}) # if method_defined?(:_unmemoized_mime_type)
68 raise "Already memoized #{symbol}" # raise "Already memoized mime_type"
69 end # end
70 alias #{original_method} #{symbol} # alias _unmemoized_mime_type mime_type
71 #
72 if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0
73 def #{symbol}(reload = false) # def mime_type(reload = false)
74 if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty?
1aadafda » wycats 2009-04-08 Updated old AC::Base for sm... 75 #{memoized_ivar} = [#{original_method}] # @_memoized_mime_type = [_unmemoized_mime_type]
a2270ef2 » fxn 2008-12-28 Inline code comments for cl... Comment 76 end # end
77 #{memoized_ivar}[0] # @_memoized_mime_type[0]
78 end # end
79 else # else
80 def #{symbol}(*args) # def mime_type(*args)
81 #{memoized_ivar} ||= {} unless frozen? # @_memoized_mime_type ||= {} unless frozen?
82 reload = args.pop if args.last == true || args.last == :reload # reload = args.pop if args.last == true || args.last == :reload
83 #
84 if defined?(#{memoized_ivar}) && #{memoized_ivar} # if defined?(@_memoized_mime_type) && @_memoized_mime_type
85 if !reload && #{memoized_ivar}.has_key?(args) # if !reload && @_memoized_mime_type.has_key?(args)
86 #{memoized_ivar}[args] # @_memoized_mime_type[args]
87 elsif #{memoized_ivar} # elsif @_memoized_mime_type
1aadafda » wycats 2009-04-08 Updated old AC::Base for sm... 88 #{memoized_ivar}[args] = #{original_method}(*args) # @_memoized_mime_type[args] = _unmemoized_mime_type(*args)
a2270ef2 » fxn 2008-12-28 Inline code comments for cl... Comment 89 end # end
90 else # else
91 #{original_method}(*args) # _unmemoized_mime_type(*args)
92 end # end
93 end # end
94 end # end
c67d25e3 » Nielsomat 2009-03-06 Ensure ActiveSupport::Memoi... 95 #
96 if private_method_defined?(#{original_method.inspect}) # if private_method_defined?(:_unmemoized_mime_type)
97 private #{symbol.inspect} # private :mime_type
98 end # end
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 99 EOS
8a9934a9 » josh 2008-07-14 Added Memoizable mixin for ... Comment 100 end
101 end
102 end
103 end