Skip to content

Instantly share code, notes, and snippets.

@bmarini
Created January 13, 2011 16:26
Show Gist options
  • Save bmarini/778132 to your computer and use it in GitHub Desktop.
Save bmarini/778132 to your computer and use it in GitHub Desktop.
Attempting to port groovy's delegate feature as an exercise
# 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