diff --git a/lib/memoist.rb b/lib/memoist.rb index 0b8558f..c1e5058 100644 --- a/lib/memoist.rb +++ b/lib/memoist.rb @@ -31,7 +31,7 @@ def self.memoist_eval(klass, *args, &block) end def self.extract_reload!(method, args) - if args.length == method.arity + 1 && (args.last == true || args.last == :reload) + if args.length == method.arity.abs + 1 && (args.last == true || args.last == :reload) reload = args.pop end reload diff --git a/test/memoist_test.rb b/test/memoist_test.rb index bc21516..346cc6d 100644 --- a/test/memoist_test.rb +++ b/test/memoist_test.rb @@ -70,6 +70,26 @@ def age memoize :name, :age + def sleep(hours = 8) + @counter.call(:sleep) + hours + end + memoize :sleep + + def sleep_calls + @counter.count(:sleep) + end + + def update_attributes(options = {}) + @counter.call(:update_attributes) + true + end + memoize :update_attributes + + def update_attributes_calls + @counter.count(:update_attributes) + end + protected def memoize_protected_test @@ -167,6 +187,28 @@ def test_memoization assert_equal 1, @person.name_calls end + def test_memoize_with_optional_arguments + assert_equal 4, @person.sleep(4) + assert_equal 1, @person.sleep_calls + + 3.times { assert_equal 4, @person.sleep(4) } + assert_equal 1, @person.sleep_calls + + 3.times { assert_equal 4, @person.sleep(4, :reload) } + assert_equal 4, @person.sleep_calls + end + + def test_memoize_with_options_hash + assert_equal true, @person.update_attributes(:age => 21, :name => 'James') + assert_equal 1, @person.update_attributes_calls + + 3.times { assert_equal true, @person.update_attributes(:age => 21, :name => 'James') } + assert_equal 1, @person.update_attributes_calls + + 3.times { assert_equal true, @person.update_attributes({:age => 21, :name => 'James'}, :reload) } + assert_equal 4, @person.update_attributes_calls + end + def test_memoization_with_punctuation assert_equal true, @person.name?