以下の内容はhttps://unageanu.hatenablog.com/entry/20080731/1217514776より取得しました。


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

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




以上の内容はhttps://unageanu.hatenablog.com/entry/20080731/1217514776より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14