groovy.beans
@Documented @Retention(value=SOURCE) @Target(value={FIELD,TYPE}) public @interface Vetoable
@groovy.beans.Vetoable class Person { String firstName def zipCode }This code is transformed by the compiler into something resembling the following snippet. Notice the difference between a String and a def/Object property:
public class Person implements groovy.lang.GroovyObject { private java.lang.String firstName private java.lang.Object zipCode final private java.beans.VetoableChangeSupport this$vetoableChangeSupport public Person() { this$vetoableChangeSupport = new java.beans.VetoableChangeSupport(this) } public void addVetoableChangeListener(java.beans.VetoableChangeListener listener) { this$vetoableChangeSupport.addVetoableChangeListener(listener) } public void addVetoableChangeListener(java.lang.String name, java.beans.VetoableChangeListener listener) { this$vetoableChangeSupport.addVetoableChangeListener(name, listener) } public void removeVetoableChangeListener(java.beans.VetoableChangeListener listener) { this$vetoableChangeSupport.removeVetoableChangeListener(listener) } public void removeVetoableChangeListener(java.lang.String name, java.beans.VetoableChangeListener listener) { this$vetoableChangeSupport.removeVetoableChangeListener(name, listener) } public void fireVetoableChange(java.lang.String name, java.lang.Object oldValue, java.lang.Object newValue) throws java.beans.PropertyVetoException { this$vetoableChangeSupport.fireVetoableChange(name, oldValue, newValue) } public java.beans.VetoableChangeListener[] getVetoableChangeListeners() { return this$vetoableChangeSupport.getVetoableChangeListeners() } public java.beans.VetoableChangeListener[] getVetoableChangeListeners(java.lang.String name) { return this$vetoableChangeSupport.getVetoableChangeListeners(name) } public void setFirstName(java.lang.String value) throws java.beans.PropertyVetoException { this.fireVetoableChange('firstName', firstName, value) firstName = value } public void setZipCode(java.lang.Object value) throws java.beans.PropertyVetoException { this.fireVetoableChange('zipCode', zipCode, value) zipCode = value } }
VetoableASTTransformation