ExpandoMetaClass - Overriding invokeMethod, getProperty and setProperty
It is also possible to override the methods invokeMethod, getProperty and setPropety on ExpandoMetaClass thus allowing even more dynamic behaviour.
As an example of overring invokeMethod, take this simple example:
So what is happening here? Well firstly we've overriden invokeMethod by assigning it an appropriate closure, but in addition we first look-up a MetaMethod with the line:
A MetaMethod in Groovy is a method that is known to exist on the MetaClass whether added at runtime or whatever, thus we check if there is an existing MetaMethod and if there isn't we simply return "bar", hence the behaviour of the assert statements is correct.
Overriding getProperty and setProperty
Again overriding getProperty and setProperty is similar to the above:
The important thing to note here is that instead of a MetaMethod we look-up a MetaProperty instance if that exists we call the getProperty method of the MetaProperty passing the delegate (ie the instance of the class).
The only different with setProperty is you need the value in the method signature and to call setProperty on the MetaProperty: