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