From d3052454e14f6461f26b7a02153e4daa7d525b60 Mon Sep 17 00:00:00 2001 From: PikachuEXE Date: Tue, 20 Jun 2017 11:44:24 +0800 Subject: [PATCH] Fix undefined `memoized_methods` error raisied when parent class does not call `memoize` --- lib/memoist.rb | 18 ++++++++++-------- test/memoist_test.rb | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/lib/memoist.rb b/lib/memoist.rb index 92e1a7b..918d05d 100644 --- a/lib/memoist.rb +++ b/lib/memoist.rb @@ -4,6 +4,16 @@ module Memoist + def self.extended(extender) + Memoist.memoist_eval(extender) do + unless singleton_class.method_defined?(:memoized_methods) + def self.memoized_methods + @_memoized_methods ||= [] + end + end + end + end + def self.memoized_ivar_for(method_name, identifier=nil) "@#{memoized_prefix(identifier)}_#{escape_punctuation(method_name)}" end @@ -116,14 +126,6 @@ def memoize(*method_names) identifier = method_names.pop[:identifier] end - Memoist.memoist_eval(self) do - unless singleton_class.method_defined?(:memoized_methods) - def self.memoized_methods - @_memoized_methods ||= [] - end - end - end - method_names.each do |method_name| unmemoized_method = Memoist.unmemoized_method_for(method_name, identifier) memoized_ivar = Memoist.memoized_ivar_for(method_name, identifier) diff --git a/test/memoist_test.rb b/test/memoist_test.rb index 051cc9d..c821c89 100644 --- a/test/memoist_test.rb +++ b/test/memoist_test.rb @@ -181,6 +181,33 @@ def counter memoize :counter end + class Abb + extend Memoist + + def run(*args) + flush_cache if respond_to?(:flush_cache) + execute + end + + def execute + some_method + end + + def some_method + # Override this + end + end + + class Bbb < Abb + + def some_method + :foo + end + memoize :some_method + end + + + def setup @person = Person.new @calculator = Calculator.new @@ -256,6 +283,13 @@ def test_flush_cache assert_equal 2, @calculator.counter end + def test_flush_cache_in_child_class + x = Bbb.new + + # This should not throw error + x.run + end + def test_unmemoize_all assert_equal 1, @calculator.counter