2006-06-06
Trigger
before_methodname, after_methodname を定義しておくとメソッドが呼ばれる前後に自動でそれらが呼ばれるような実装。なんかスマートじゃないなぁ。あとわりかし問題が起きまくりそうな実装だ。。
class Trigger
  METHOD_TMP_PREFIX = '__aop__'
  def initialize
    (methods - Object.methods).each do |method|
      unless method == 'method_missing' || method.match(/^(before|after)/)
        self.class.alias_method METHOD_TMP_PREFIX + method, method
        self.class.remove_method method
      end
    end
  end
  def method_missing(name, *args)
    method = METHOD_TMP_PREFIX + name.to_s
    if methods.include? method
      __send__("before_#{name}", *args) if methods.include? "before_#{name}"
      result = __send__("#{method}", *args)
      __send__("after_#{name}", result, *args) if methods.include? "after_#{name}"
      result
    else
      super
    end
  end
  def self.alias_method(*args)
    super
  end
  def self.remove_method(*args)
    super
  end
end
class Foo < Trigger
  def before_bar
    puts 'before_call: bar'
  end
  def bar
    puts 'bar'
    'bar[result]'
  end
  def after_bar(result)
    puts "after_call: #{result}"
  end
  def baz
    puts 'baz'
  end
end
foo = Foo.new
foo.bar
foo.baz
実行結果
before_call: bar
bar
after_call: bar[result]
baz
hige
ヒゲの人にとあるライブラリの ruby バインディングつくってー、つったら ruby 知らないのに速攻作ってくれた。すげーぜヒゲ。飛べないヒゲはただのヒゲ!!
debian pdiff
na
中目黒前のツタヤの品揃え
アリエナス。タワレコか HMV ホシス。新星堂はシーズンでやる Jazz 100選、みたいなCDの一シーズン前のが 20%OFF, 1200円で買えていいんだよなー。割と Jazz とかそこいらの CD って店頭で買うのがほとんどだったから最近全く買って無い罠。
AOP とか DI とか
ruby じゃ別にほしいときないなー、と思う。FW に AOP 的な概念が盛り込まれてて重要なところでできりゃいーしな。
会社の FW に DI 的な要素盛り込んでわりかし便利になったけど、あれは実装が先にあって解決する手段での DI 導入だったしなー。