method_missingでインターセプト
インスタンスにメソッドが定義されていない場合、method_missing が実行されます。これを利用して簡単なインターセプタが作れます。
サンプル:
class EchoInterceptor def initialize(delegate) @delegate = delegate end def method_missing( name, *args ) begin # メソッド呼び出しの前に実行する処理 print "method " << name.to_s << " start.\n" return @delegate.send(name, *args) ensure # メソッド呼び出しの後に実行する処理 print "method " << name.to_s << " end.\n" end end end class Tora def meow print "meow!\n" end end tora = Tora.new tora = EchoInterceptor.new(tora) # インターセプタを適用 tora.meow
出力:
method meow start. meow! method meow end.
修正 (07-06-30)
delegateのAPI呼び出しはObject#sendで行う必要があるため、サンプルコードを修正しました。Method#callを使うと、インターセプタを2重に適用した場合にエラーになります。(詳細はMethod#callとObject#sendを参照。)