Created
January 13, 2011 16:26
-
-
Save bmarini/778132 to your computer and use it in GitHub Desktop.
Attempting to port groovy's delegate feature as an exercise
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# http://dontmindthelanguage.wordpress.com/2009/12/09/groovy-delegate-annotation/ | |
# class Cleaner { | |
# def doWork() { "clean" } | |
# } | |
# | |
# class Employee { | |
# def doWork() { "work!" } | |
# } | |
# | |
# class Manager { | |
# @Delegate Employee employee = new Employee() | |
# @Delegate Cleaner cleaner = new Cleaner() | |
# } | |
# | |
# manager = new Manager() | |
# | |
# assert "work!" == manager.doWork() | |
module GroovyDelegation | |
def delegate(delegatee) | |
@@_delegatees_ ||= begin | |
class_eval do | |
def method_missing(name, *args, &block) | |
d = @@_delegatees_.find { |d| d.respond_to?(name) } | |
d ? d.send(name, *args, &block) : super | |
end | |
end | |
[] | |
end | |
@@_delegatees_.push(delegatee) | |
end | |
end | |
Object.extend GroovyDelegation | |
class Cleaner | |
def work | |
"clean" | |
end | |
def clean | |
"clean" | |
end | |
end | |
class Employee | |
def work | |
"work!" | |
end | |
end | |
class Manager | |
delegate Employee.new | |
delegate Cleaner.new | |
end | |
require "test/unit" | |
class TestLibraryFileName < Test::Unit::TestCase | |
def setup | |
@manager = Manager.new | |
end | |
def test_groovy_style_delegation | |
assert_equal "work!", @manager.work | |
assert_equal "clean", @manager.clean | |
assert_raise(NoMethodError) { @manager.nonexistent_method } | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment