forwardableの使い方などはここが詳しい。
extend Forwardable
するとdef_delegators
を利用して、特定のオブジェクトに処理を委譲することができる。
このとき、メソッドの呼び出し制限を超えてオブジェクトのメソッドにアクセスすることができる。
require "forwardable"
class Forwarded
def pub
p "pub"
end
def pro
p "pro"
end
def pri
p "pri"
end
protected :pro
private :pri
end
class Forward
extend Forwardable
def_delegators :@forwarded, :pub, :pro, :pri
def initialize
@forwarded = Forwarded.new
end
end
forward = Forward.new
forward.pub
# => "pub"
forward.pro
# => "pro" (アクセスできる!!)
forward.pri
# => "pri" (アクセスできる!!)
柔軟というか、なんというか。