Small Gem: @Delegate annotation

·

1 min read

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.