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
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 13 memoize_all unless frozen?
14 freeze_without_memoizable
15 end
16
17 def memoize_all
18 methods.each do |m|
19 if m.to_s =~ /^_unmemoized_(.*)/
20 if method(m).arity == 0
21 __send__($1)
22 else
23 ivar = :"@_memoized_#{$1}"
24 instance_variable_set(ivar, {})
a8057669 » jeremy 2008-08-07 Fixed memoize with punctuat... 25 end
26 end
27 end
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 28 end
ae6105ef » jeremy 2008-07-27 Don't rememoize if already ... 29
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 30 def unmemoize_all
31 methods.each do |m|
32 if m.to_s =~ /^_unmemoized_(.*)/
33 ivar = :"@_memoized_#{$1}"
34 instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
35 end
36 end
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 37 end
38 end
39
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 40 def memoize(*symbols)
41 symbols.each do |symbol|
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 42 original_method = :"_unmemoized_#{symbol}"
43 memoized_ivar = :"@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}"
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 44
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 45 class_eval <<-EOS, __FILE__, __LINE__
46 include Freezable
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 47
8a87d8a6 » josh 2008-07-22 Improved Memoizable test co... 48 raise "Already memoized #{symbol}" if method_defined?(:#{original_method})
49 alias #{original_method} #{symbol}
50
be0d235a » josh 2008-08-06 Optimize memoized method if... 51 if instance_method(:#{symbol}).arity == 0
52 def #{symbol}(reload = false)
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 53 if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty?
54 #{memoized_ivar} = [#{original_method}]
be0d235a » josh 2008-08-06 Optimize memoized method if... 55 end
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 56 #{memoized_ivar}[0]
be0d235a » josh 2008-08-06 Optimize memoized method if... 57 end
58 else
59 def #{symbol}(*args)
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 60 #{memoized_ivar} ||= {} unless frozen?
be0d235a » josh 2008-08-06 Optimize memoized method if... 61 reload = args.pop if args.last == true || args.last == :reload
c609be45 » josh 2008-07-18 Ruby 1.9: Ensure Memoizable... 62
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 63 if #{memoized_ivar}
64 if !reload && #{memoized_ivar}.has_key?(args)
65 #{memoized_ivar}[args]
66 elsif #{memoized_ivar}
67 #{memoized_ivar}[args] = #{original_method}(*args)
68 end
be0d235a » josh 2008-08-06 Optimize memoized method if... 69 else
3fc9a67c » jeremy 2008-08-13 memoize_ and unmemoize_all 70 #{original_method}(*args)
be0d235a » josh 2008-08-06 Optimize memoized method if... 71 end
ef6f6625 » josh 2008-07-18 Changed ActiveSupport::Memo... Comment 72 end
73 end
74 EOS
8a9934a9 » josh 2008-07-14 Added Memoizable mixin for ... Comment 75 end
76 end
77 end
78 end