rails / rails

Ruby on Rails

This URL has Read+Write access

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