2017-02-02 6 views
-7

自分のネームスペースに定義されているすべてのメソッドをaround/before/afterフィルタでラップして、コールの発生や未使用のメソッドをログできるようにする方法はありますか?ルビのすべてのメソッド呼び出しを監視する

+1

このパターンは通常「アスペクト指向プログラミング」と呼ばれ、Rubyを検索すると、アスペクトや水族館など、あなたが使用できるさまざまな宝石が得られるはずです – Amadan

+3

可能な[ Rubyモジュールですべてのメソッド呼び出しのコードを実行する](http://stackoverflow.com/questions/5513558/executing-code-for-every-method-call-in-a-ruby-module) –

答えて

1

あなたがしたいことをするためにかなりの仕事があります。 。

#!/usr/bin/env ruby 

require 'aspector' 

watcher = Aspector do 
    around(/.*/, except: Object.methods) do |proxy, *args, &block| 
    puts "before #{proxy.name} on #{proxy.receiver}" 
    proxy.call(*args, &block) 
    puts "after #{proxy.name} on #{proxy.receiver}" 
    end 
end 

class Foo 
    def self.klass 
    puts "class method" 
    end 
    def inst 
    puts "instance method" 
    end 
end 

watcher.apply(Foo) 
watcher.apply(Foo, class_methods: true) 
# => before singleton_method_added on Foo 
# after singleton_method_added on Foo 

Foo.klass 
# => before klass on Foo 
# class method 
# after klass on Foo 

Foo.new.inst 
# => before inst on #<Foo:0x007f9b648c83c0> 
# instance method 
# after inst on #<Foo:0x007f9b648c83c0> 
:幸いにも、あなたがそれを望んでいる人だけじゃない、と私はコメントで言ったようにそれは、「アスペクト指向プログラミング」の下で、(前に行​​われています

をここでAspectorの宝石を使用した例です

関連する問題