2011-01-20 21 views
0

私はあなたがエイリアスinstance_methodすべてのdef呼び出しのRuby呼び出しメソッド?

class_method :instance_method, 

を書いて、ラッパー・メソッド内から、それが呼び出されるたびにそれを呼び出すことができるようなクラスメソッドを作るいくつかのコードを見てきました。 class_methodに電話をかけ、次のすべての定義呼び出し(privateの仕組みなど)に適用する方法がありますか?

答えて

1

私はあなたの質問をよく理解していません。将来的には、実行しようとしているものの仕様を、できれば実行可能なテストスイートの形式で提供してください。本当にがあなたの質問に答えているかどうかを確認できます。

あなたはおそらくこのようなことについて話していますか?このような

module MethodHook 
    private 

    def class_method(m=nil) 
    return if @__recursing__ # prevent infinite recursion 
    return @__class_method__ = true unless m 

    @__recursing__ = true 

    old_m = instance_method(m) 
    define_method(m) do |*args, &block| 
     puts "before #{m}(#{args.join(', ')})" # wrap wrap wrap 
     old_m.bind(self).(*args, &block) 
     puts "after #{m}" # more wrapping 
    end 

    @__recursing__ = nil 
    end 

    def method_added(m) 
    class_method(m) if @__class_method__ 
    super 
    end 
end 

用途:

class Foo 
    extend MethodHook 

    def unwrapped 
    puts __method__ 
    end 

    class_method 

    def wrapped 
    puts __method__ 
    end 
end 

f = Foo.new 

f.unwrapped 
# unwrapped 

f.wrapped 
# before wrapped() 
# wrapped 
# after wrapped 

class Foo 
    class_method(:unwrapped) 
end 

f.unwrapped 
# before unwrapped() 
# wrapped 
# after unwrapped 
+0

漠然とした質問については申し訳ありませんが、あなたは間違いなく、私が求めていたものの要点を得ました。ありがとうございました –

関連する問題