<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -10,25 +10,37 @@ module ActiveSupport
       end
 
       def freeze_with_memoizable
-        unless frozen?
-          methods.each do |method|
-            if method.to_s =~ /^_unmemoized_(.*)/
-              begin
-                __send__($1).freeze
-              rescue ArgumentError
-              end
+        memoize_all unless frozen?
+        freeze_without_memoizable
+      end
+
+      def memoize_all
+        methods.each do |m|
+          if m.to_s =~ /^_unmemoized_(.*)/
+            if method(m).arity == 0
+              __send__($1)
+            else
+              ivar = :&quot;@_memoized_#{$1}&quot;
+              instance_variable_set(ivar, {})
             end
           end
         end
+      end
 
-        freeze_without_memoizable
+      def unmemoize_all
+        methods.each do |m|
+          if m.to_s =~ /^_unmemoized_(.*)/
+            ivar = :&quot;@_memoized_#{$1}&quot;
+            instance_variable_get(ivar).clear if instance_variable_defined?(ivar)
+          end
+        end
       end
     end
 
     def memoize(*symbols)
       symbols.each do |symbol|
-        original_method = &quot;_unmemoized_#{symbol}&quot;
-        memoized_ivar = &quot;@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}&quot;
+        original_method = :&quot;_unmemoized_#{symbol}&quot;
+        memoized_ivar = :&quot;@_memoized_#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}&quot;
 
         class_eval &lt;&lt;-EOS, __FILE__, __LINE__
           include Freezable
@@ -38,21 +50,24 @@ module ActiveSupport
 
           if instance_method(:#{symbol}).arity == 0
             def #{symbol}(reload = false)
-              if !reload &amp;&amp; defined? #{memoized_ivar}
-                #{memoized_ivar}
-              else
-                #{memoized_ivar} = #{original_method}
+              if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty?
+                #{memoized_ivar} = [#{original_method}]
               end
+              #{memoized_ivar}[0]
             end
           else
             def #{symbol}(*args)
-              #{memoized_ivar} ||= {}
+              #{memoized_ivar} ||= {} unless frozen?
               reload = args.pop if args.last == true || args.last == :reload
 
-              if !reload &amp;&amp; #{memoized_ivar} &amp;&amp; #{memoized_ivar}.has_key?(args)
-                #{memoized_ivar}[args]
+              if #{memoized_ivar}
+                if !reload &amp;&amp; #{memoized_ivar}.has_key?(args)
+                  #{memoized_ivar}[args]
+                elsif #{memoized_ivar}
+                  #{memoized_ivar}[args] = #{original_method}(*args)
+                end
               else
-                #{memoized_ivar}[args] = #{original_method}(*args)
+                #{original_method}(*args)
               end
             end
           end</diff>
      <filename>activesupport/lib/active_support/memoizable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -119,6 +119,21 @@ uses_mocha 'Memoizable' do
       assert_equal 3, @calculator.counter
     end
 
+    def test_unmemoize_all
+      assert_equal 1, @calculator.counter
+
+      assert @calculator.instance_variable_get(:@_memoized_counter).any?
+      @calculator.unmemoize_all
+      assert @calculator.instance_variable_get(:@_memoized_counter).empty?
+
+      assert_equal 2, @calculator.counter
+    end
+
+    def test_memoize_all
+      @calculator.memoize_all
+      assert @calculator.instance_variable_defined?(:@_memoized_counter)
+    end
+
     def test_memoization_cache_is_different_for_each_instance
       assert_equal 1, @calculator.counter
       assert_equal 2, @calculator.counter(:reload)</diff>
      <filename>activesupport/test/memoizable_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3284fbb86629f398ba2634dd9369bc65beb7d6ae</id>
    </parent>
  </parents>
  <author>
    <name>Jeremy Kemper</name>
    <login>jeremy</login>
    <email>jeremy@bitsweat.net</email>
  </author>
  <url>http://github.com/rails/rails/commit/3fc9a67c04bade858e7ac7eb8cd94eec6a63ec27</url>
  <id>3fc9a67c04bade858e7ac7eb8cd94eec6a63ec27</id>
  <committed-date>2008-08-13T17:26:27-07:00</committed-date>
  <authored-date>2008-08-13T17:22:38-07:00</authored-date>
  <message>memoize_ and unmemoize_all</message>
  <tree>dc03084bc85e646542441b8d132472ed8a3a797f</tree>
  <committer>
    <name>Jeremy Kemper</name>
    <login>jeremy</login>
    <email>jeremy@bitsweat.net</email>
  </committer>
</commit>
