rubyでそれっぽいdecorator

pythonのdecoratorかっこいいなあとか。rubyでも欲しい。普通にrubyッぽくやるなら多分privateとかのようにシンボル与えてそれを繋ぐように書くんだろうけど、pythonっぽく前置したいなあとか。こないだmethod_addedとか覚えたのでそれ使ってみようと。とかしてて、全然内部が理解できてないことに気がついた。

こんなん

class Object
    @@guard = true
    @@method = nil
    def decorator(mth)
        mth = method(mth) if mth.class == Symbol
        @@method = mth
        @@guard = false
    end
    def self.method_added(name)
        if @@guard; return else @@guard = true end

        ret = @@method.call(method(name))
        define_method name, ret
    end
end

んーー。Objectにつけちゃっていいんだろうかとか、guardしないとdefine_methodでまたaddedが呼ばれて無限ループになってしまうのでつけたんだけど、んーーー汚い。更にThread unsafeなり。ダメダメ。んーー。どないすれば。

一応

動く。

#!/usr/bin/env ruby

require 'decorator'

def hello(m, *args)
    proc {
        print "hello "
        m.call()
    }
end

decorator :hello
def foo
    puts "foo"
end

decorator proc { |m, *args|
    proc {
        print "bye "
        m.call()
    }
}
def bar
    puts "bar"
end

def baz
    puts "baz"
end

foo
bar
baz

tkuro@sawshark> ruby -I. dctest.rb
hello foo
bye bar
baz

結論

RHG読み直そう。。。