OK、問題を2つに分けましょう-そのようなメソッドのリストを取得し、モジュールでプロキシを作成します。
リストを取得するのは少し難しいかもしれません:
MyModule::UselessName.public_methods(false) - MyModule::UselessName.superclass.public_methods(false)
ここでは、すべてのパブリッククラスメソッドのリストから始めて、そこからすべてのスーパークラスのパブリッククラスメソッドのリストを差し引きます。
ここで、メソッドの名前がわかっていると仮定して、プロキシメソッドを作成する必要があります。
metaclass = class << MyModule; self; end
metaclass.send(:define_method, :x) do |*args, &block|
MyModule::UselessName.send(:x, *args, &block)
end
このコードは、実行時に次の定義と同等になります。
module MyModule
def x(*args, &block)
MyModule::UselessName.send(:x, *args, &block)
end
end
それでは、簡単な関数にまとめましょう。
def make_proxies(mod, cls)
methods = cls.public_methods(false) - cls.superclass.public_methods(false)
metaclass = class << mod; self; end
methods.each do |method|
metaclass.send(:define_method, method) do |*args, &block|
cls.send(method, *args, &block)
end
end
end
したがって、必要なモジュールとクラスに対して呼び出す必要があります。「destination」モジュールは、クラスを所有する「source」モジュールとは異なる場合があるため、すべてのメソッドを1つのモジュールにまとめることができます(名前が異なる場合、またはクラス名を使用してプレフィックスを付ける場合)。たとえば、あなたの場合は、次の電話をかけるだけです。
make_proxies(MyModule, MyModule::UselessName)