2008/8/1 Daniel Berger said:
Hi all,
Courtesy of Yuki Sonoda, I stumbled across this:
http://gist.github.com/1724
Looks pretty cool to me. Decoration plus AOP!
I've written a Python-style-decorators library, too.
(Code is here:
http://repo.or.cz/w/decorate.git)
Mainly because I don't like Ruby's private/protected methods.
So the library provides decorators to mark single method
definitions as private/protected/public:
require "decorate/private_method"
class Foo
private_method
def foo
...
end
end
Around/before/after methods are also possible:
require "decorate/around_decorator"
class MyObject
extend Decorate::AroundDecorator
around_decorator :log_time, :call => :log_time
def log_time(call)
t0 = Time.now
call.transfer
puts "#{call.receiver}.#{call.message}(#{call.args}) took
#{Time.now - t0} seconds"
call.result
end
log_time
def do_something(x)
sleep(rand(x))
end
end
m = MyObject.new
m.do_something(2)
m.do_something(1)
$ ruby around_example.rb
#<MyObject:0x7fa30c7c9c08>.do_something(2) took 0.998558 seconds
#<MyObject:0x7fa30c7c9c08>.do_something(1) took 1.9e-05 seconds
Stefan