Rubyでメソッドのフック

Rubyでメソッドのフックをする方法をメモ. ここでいうフックとは,「実行するプログラムコードに対して割込み、処理を捕捉すること」と定義する.

class Hoge
  def hello
    puts "hello!"
  end
end

# オープンクラス
class Hoge 
  alias_method :old_hello, :hello
  def hello
    puts "---before---"
    old_hello()
    puts "---after---"
  end
end

hoge = Hoge.new
hoge.hello()
#---before---
#hello!
#---after---

ちゃんとフックできてる.
Module#alias_method*1でオリジナルのhelloメソッドをold_helloメソッドとして残しておく. その後にhelloメソッドをオーバーライドして, オリジナルのメソッドの前と後に処理を挟み込む.

ネタ本

この本にこういうテクニックが分かりやすく説明されている.

メタプログラミングRuby

メタプログラミングRuby

黒魔術? いいや, 全ては「プログラミング」なのだ. JSでもフックをやってみたいです.

*1:HogeクラスはClassクラスのオブジェクト. ClassクラスのスーパクラスはModuleクラス. 全てはオブジェクトなのでござる.