山口と申します。

インスタンスメッソド hookについて、質問させて下さい。

下記のclassのインスタンスメッソド内で、
if !@is_in_nw then … return nil end を実行している method が多数でてきた
ので、
該当部分を、hook を用いて記述すれば、綺麗なコードになるなと思い、Web等で
色々調べたのですが、
これといった方法が見当たらず、良い記述方法があれば、ご教示いただけますで
しょうか?

if !@is_in_nw the … が無いmethodや、他のクラス(別ファイルで定義)にも似た
ような箇所があるので、
それらを考慮し、クラス内にて記述できればと思っています。

http://stackoverflow.com/questions/3236194/defining-method-called-how-do-i-make-a-hook-method-which-gets-called-every-t

に記載されていた
set_trace_func proc { |event, file, line, id, binding, classname|
  # only interested in events of type 'call' (Ruby method calls)
  # see the docs for set_trace_func for other supported event types
  puts "#{classname} #{id} called" if event == 'call'
}
だと、claass name id event で、case等を用いて記述するのがいいのかな…とは
思いつつ
や
エイリアスチェイニング http://blog.kymmt.com/entry/hook-by-alias-chaining-in-ruby

だと、多数のmethodがあるので、method内で記述した方がよいし…
と悩んでおります。

class WebAPI

  attr_reader: is_in_nw

  def initialize(ip,is_in_nw=false)
    @ip = ip
    @is_in_nw = is_in_nw
    ….
  end

  def getInformation
    if !@is_in_nw then
       puts "TV(#{@ip}) is not in Network"
 return nil
    end
    ….
  end

  def Register(code)
    if !@is_in_nw then
      puts "TV(#{@ip}) is not in Network"
      return nil
    end
    ….
  end

  def Play(function)
    if !@is_in_nw then
      puts "TV(#{@ip}) is not in Network"
      return nil
    end
  …
  # network上に存在しない場合、
# 以降のコードを実行すると、使用しているgem が raise を上げるのでスクリ
プトが終了してしまう
end

  …

  # 上の様な if !@is_in_nw then … return nil end 
  # を実行している method が多数あるので
# 該当部分を hook を用いて記述したい
# 中には、if !@is_in_nw the … が無い場合も考慮

end

TV_IP=’192.168.0.11’

# TV_IPを持つ機器がネットワーク上にいるか確認

if TVがネットワーク上に存在 then 
is_in_nw = true
else
 is_in_nw = false
end

# tv_obj 作成
tv_obj = WebAPI.new(TV_IP,is_in_nw)
tv_obj.Play(“tuner”)