I wrote this as a small practice for some ruby meta-programming fun. The implementation is relatively simple, and is thread safe.
There are also these other two implementations:
- Yehuda Katz's Ruby Decorators
- Michael Fairley's Method Decorators
Add this line to your application's Gemfile:
gem 'ruby_decorators'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ruby_decorators
class Hi < RubyDecorator
def call(this, *args, &blk)
this.call(*args, &blk).sub('hello', 'hi')
end
end
class Batman < RubyDecorator
def call(this, *args, &blk)
this.call(*args, &blk).sub('world', 'batman')
end
end
class Catwoman < RubyDecorator
def initialize(*args)
@args = args.any? ? args : ['catwoman']
end
def call(this, *args, &blk)
this.call(*args, &blk).sub('world', @args.join(' '))
end
end
class World
extend RubyDecorators
def initialize
@greeting = 'hello world'
end
def hello_world
@greeting
end
+Batman
def hello_batman
@greeting
end
+Hi
+Catwoman
def hello_catwoman
@greeting
end
+Catwoman.new('super', 'catwoman')
def hello_super_catwoman
@greeting
end
end
world = World.new
world.hello_world # => "hello world"
world.hello_batman # => "hello batman"
world.hello_catwoman # => "hi catwoman"
world.hello_super_catwoman # => "hello super catwoman"
Copyright (c) 2012 Fred Wu
Licensed under the MIT license.