Small Gem: @Delegate annotation
While looking through some source code of the open source library groovy-wslite, I came across an annotation I had not seen before - @Delegate. This annotation adds all public instance methods of the annotated field to the present class. In the example from groovy-wslite, the field soapResponse is annotated with @Delegate:
class SoapFaultException {
@Delegate
SoapResponse soapResponse
}
This means that all of SoapResponse's public instance methods will be available as methods on all instances of SoapFaultException, and you can do the following:
try {
// do something
} catch (SoapFaultException e) {
log.info(e.getFault())
}
Note that getFault isn't defined in SoapFaultException. But it's defined in SoapResponse and since @Delegate is used, we can use it as if it's defined in SoapFaultException. Behind the scenes, the above code translates to:
try {
// do something
} catch (SoapFaultException e) {
log.info(e.soapResponse.getFault())
}
See more info about @Delegate here.