A Day in the Life

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 導入だったしなー。

記事の一覧 >