From 77f8216e935d9a1a637ac6b74ccdb38bc61142ad Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 24 Jun 2019 15:07:00 -0700 Subject: [PATCH] Document and add spec for delegating to constants in Forwardable Fixes [Bug #13142] --- lib/forwardable.rb | 10 ++++++++-- test/test_forwardable.rb | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/forwardable.rb b/lib/forwardable.rb index f5202f9318..91c932913e 100644 --- a/lib/forwardable.rb +++ b/lib/forwardable.rb @@ -122,7 +122,8 @@ class << self end # Takes a hash as its argument. The key is a symbol or an array of - # symbols. These symbols correspond to method names. The value is + # symbols. These symbols correspond to method names, instance variable + # names, or constant names (see def_delegator). The value is # the accessor to which the methods will be delegated. # # :call-seq: @@ -160,9 +161,12 @@ def def_instance_delegators(accessor, *methods) # Define +method+ as delegator instance method with an optional # alias name +ali+. Method calls to +ali+ will be delegated to - # +accessor.method+. + # +accessor.method+. +accessor+ should be a method name, instance + # variable name, or constant name. Use the full path to the + # constant if providing the constant name. # # class MyQueue + # CONST = 1 # extend Forwardable # attr_reader :queue # def initialize @@ -170,12 +174,14 @@ def def_instance_delegators(accessor, *methods) # end # # def_delegator :@queue, :push, :mypush + # def_delegator 'MyQueue::CONST', :to_i # end # # q = MyQueue.new # q.mypush 42 # q.queue #=> [42] # q.push 23 #=> NoMethodError + # q.to_i #=> 1 # def def_instance_delegator(accessor, method, ali = method) gen = Forwardable._delegator_method(self, accessor, method, ali) diff --git a/test/test_forwardable.rb b/test/test_forwardable.rb index b3f8467c5c..0a90d3a878 100644 --- a/test/test_forwardable.rb +++ b/test/test_forwardable.rb @@ -3,6 +3,7 @@ require 'forwardable' class TestForwardable < Test::Unit::TestCase + INTEGER = 42 RECEIVER = BasicObject.new RETURNED1 = BasicObject.new RETURNED2 = BasicObject.new @@ -27,6 +28,16 @@ def test_def_instance_delegator end end + def test_def_instance_delegator_constant + %i[def_delegator def_instance_delegator].each do |m| + cls = forwardable_class do + __send__ m, 'TestForwardable::INTEGER', :to_i + end + + assert_equal 42, cls.new.to_i + end + end + def test_def_instance_delegator_using_args_method_as_receiver %i[def_delegator def_instance_delegator].each do |m| cls = forwardable_class( -- 2.21.0