Needleのインターセプタはプロキシ方式です。
Needleのインターセプタはプロキシ方式です。レジストリに登録したインスタンスから自身のメソッドを呼び出した場合、インターセプタは作動しません。
require 'rubygems' require 'needle' # レジストリに登録するサービスクラス class Kitten def initialize(name) @name = name end def name @name end def meow( count ) # 自身のメソッドを呼び出す name + " : #{'meow!' * count}" end end # レジストリ registry = Needle::Registry.define {|builder| builder.mii { Kitten.new("mii") } } # サービス「mii」にインターセプタを適用 registry.intercept( :mii ).doing {|chain,context| begin puts "before.. #{context.sym}( #{context.args.join(", ")} )" chain.process_next( context ) ensure puts "after.. #{context.sym}" end } # サービスの取得とメソッドの実行。 mii = registry[:mii] # サービスのAPIを実行。 # メソッド内で、サービス自身のメソッド「name」が実行されるが # その呼び出しではインターセプタが作動しない puts mii.meow(3) puts "\n---" # 外側から呼び出すと作動する。 puts mii.name
実行結果です。
before.. meow( 3 ) after.. meow mii : meow!meow!meow! --- before.. name( ) after.. name mii
個人的にはそんなに不都合は感じない。作動して欲しくない場合もあったりするし、まぁ時と場合によるなー。