Groovy Delegation Pattern Using invokeMethod and propertyMissing methods
Following DRY is practised religously in my current project. Recently, I identified a case where code repetition had long been ignored. We used to pass either a domain object or a command object in the view model. Due to this, many domain methods had to be duplicated in the command object. This was probablematic because one would easily forget to create/modify a function in the command object if it was created/modified in the domain object. The code was smelling bad. The classes were something like this:
[java]
Class College{
//attributes
//somethods
}
Class CollegeCO{
College college
//other attributes and constraints
// repetitive College methods
}
[/java]
Groovy intercepts all methods and property access via invokeMethod and get/SetProperty property hooks. So all I needed to do was to override invokeMethod() and propertyMissing() functions in the CommandObject like this:
[java]
def invokeMethod(String name, args) {
college.invokeMethod(name, args)
}
def propertyMissing(String name) {
college."$name"
}
[/java]
So any missing method or property call on command object was automatically delegated to the college object. This is a simple way of utilising the Delegation Patttern using Groovy.
Hope this helps.
Imran Mir
Imran[at]intelligrape.com