読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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

個人的にはそんなに不都合は感じない。作動して欲しくない場合もあったりするし、まぁ時と場合によるなー。