# Refactor.rb (decoration plus AOP)

**URL:** <https://www.ruby-forum.com/t/refactor-rb-decoration-plus-aop/144683>\
**Category:** Ruby\
**Created:** [August 1, 2008, 5:41am UTC](https://www.ruby-forum.com/t/refactor-rb-decoration-plus-aop/144683 "2008-08-01T05:41:07Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [August 1, 2008, 5:41am UTC](https://www.ruby-forum.com/t/refactor-rb-decoration-plus-aop/144683/1 "2008-08-01T05:41:07Z")

</div>

Hi all,

Courtesy of Yuki S., I stumbled across this:

> <https://gist.github.com/1724>

Looks pretty cool to me. Decoration plus AOP!

Ara, have you already done something like this?

Just thought I’d mention it.

Regards,

Dan

---

<div class="post-metadata">

**Author:** ![danielb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/c57346/32.png) [@danielb](https://www.ruby-forum.com/u/danielb)\
**Post date:** [August 1, 2008, 1:38pm UTC](https://www.ruby-forum.com/t/refactor-rb-decoration-plus-aop/144683/2 "2008-08-01T13:38:17Z")

</div>

2008/8/1 Daniel B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Hi all,
> 
> Courtesy of Yuki S., I stumbled across this:
> 
> [1724’s gists · GitHub](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](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
