From 179746461f72b82c0e0e22c9398e7d48cb1a8546 Mon Sep 17 00:00:00 2001 From: Niels Ganser Date: Thu, 5 Mar 2009 19:38:39 +0100 Subject: [PATCH] ActiveSupport::Memoizable now respects the private keyword E.g. if you define a private instance method and later call memoize :your_method, the methods created by ActiveSupport::Memoizable will also be private. --- activesupport/lib/active_support/memoizable.rb | 4 ++++ activesupport/test/memoizable_test.rb | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletions(-) diff --git a/activesupport/lib/active_support/memoizable.rb b/activesupport/lib/active_support/memoizable.rb index 952b4d8..9428d8e 100644 --- a/activesupport/lib/active_support/memoizable.rb +++ b/activesupport/lib/active_support/memoizable.rb @@ -66,6 +66,10 @@ module ActiveSupport end # end alias #{original_method} #{symbol} # alias _unmemoized_mime_type mime_type # + private if private_instance_methods.any? do |m| # private if private_instance_methods.any? do |m| + m.to_sym == #{symbol.inspect} # m.to_sym == :mime_type + end # end + # if instance_method(:#{symbol}).arity == 0 # if instance_method(:mime_type).arity == 0 def #{symbol}(reload = false) # def mime_type(reload = false) if reload || !defined?(#{memoized_ivar}) || #{memoized_ivar}.empty? # if reload || !defined?(@_memoized_mime_type) || @_memoized_mime_type.empty? diff --git a/activesupport/test/memoizable_test.rb b/activesupport/test/memoizable_test.rb index 069ae27..da01668 100644 --- a/activesupport/test/memoizable_test.rb +++ b/activesupport/test/memoizable_test.rb @@ -4,10 +4,11 @@ class MemoizableTest < Test::Unit::TestCase class Person extend ActiveSupport::Memoizable - attr_reader :name_calls, :age_calls + attr_reader :name_calls, :age_calls, :is_bald_calls def initialize @name_calls = 0 @age_calls = 0 + @is_bald_calls = 0 end def name @@ -31,6 +32,13 @@ class MemoizableTest < Test::Unit::TestCase end memoize :name, :age + + private + def is_bald? + @is_bald_calls += 1 + "Yes" + end + memoize :is_bald? end class Company @@ -223,4 +231,14 @@ class MemoizableTest < Test::Unit::TestCase company.memoize :name assert_raise(RuntimeError) { company.memoize :name } end + + def test_private_method_memoization + person = Person.new + assert_raise(NoMethodError) { person.is_bald? } + assert_equal "Yes", person.send(:is_bald?) + assert_equal 1, person.is_bald_calls + assert_equal "Yes", person.send(:is_bald?) + assert_equal 1, person.is_bald_calls + end + end -- 1.6.1.2