require 'forwardable'
class DelegateTarget
def method_1
p 'target_1 called'
end
def method_2
p 'target_2 called'
end
def method_3
p 'target_3 called'
end
def method_4
p 'target_4 called'
end
def self.class_method
p 'Class method called'
end
end
class Foo
extend Forwardable
# method_1をfoo_method_1として定義して処理は@target.method_1に委譲する
def_delegator :@target, :method_1, :foo_method_1
# メソッド名は変えずに委譲するメソッドを複数定義
def_delegators :@target, :method_2, :method_3
# クラスメソッドにも委譲できるがFooのクラスメソッドにはならずインスタンスメソッドになる
def_delegator DelegateTarget, :class_method
def initialize(target)
@target = target
end
def method_4
p 'Foo process'
@target.method_4
end
end
foo = Foo.new(DelegateTarget.new)
foo.foo_method_1
foo.method_2
foo.method_3
foo.method_4
foo.class_method