Groovy Mixins
May 27, 2005 Leave a comment
Groovy has limited support for features like those introduced by AOP. I am just wondering when we will see AOP languages rather than extensions to other languages. Was AOP really designed to only complement OO ? Is it really possible to write a AOP language from scratch ? The following is Groovy code that uses inter-type declarations. You can type this in the Groovy console to create a Mixin.
public class Test{ @Property name; } import java.beans.*; public class InterTypeCategoryListener implements PropertyChangeListener{ public void propertyChange(PropertyChangeEvent e){ println "Property [" + e.getPropertyName() + "] changed from " + e.getOldValue() + " to " + e.getNewValue(); } } import java.beans.*; public class InterTypeCategory{ static PropertyChangeSupport support = new PropertyChangeSupport(this); public static void addPropertyChangeListener( Test bean, PropertyChangeListener listener){ support.addPropertyChangeListener(listener); } public static void addPropertyChangeListener( Test bean, String propertyName, PropertyChangeListener listener){ support.addPropertyChangeListener( propertyName, listener); } public static void removePropertyChangeListener( Test bean, String propertyName, PropertyChangeListener listener) { support.removePropertyChangeListener( propertyName, listener); } public static void removePropertyChangeListener( Test bean, PropertyChangeListener listener) { support.removePropertyChangeListener(listener); } public static void hasListeners( Test bean, String propertyName) { support.hasListeners(propertyName); } public static void firePropertyChange( Test bean, Test b1, String property, String oldval, String newval) { System.out.println( "The old value is [" + oldval + "]"); System.out.println( "The new value is [" + newval + "]"); support.firePropertyChange( property, ( oldval == null ) ? oldval : new String(oldval), new String(newval)); } static String test = "Inter-Type Declaration"; static String getSupport( Test bean ) { return support; } static String setName( Test bean, String newval ) { println "Firing Property Change event" String oldValue = bean.name bean.name = newval firePropertyChange( bean, bean, "name", oldValue, bean.name ); } } use( InterTypeCategory.class ){ Test test = new Test() test.addPropertyChangeListener( new InterTypeCategoryListener() ) test.setName( "Test" ); println "Value [" + test.name + "]" test.setName( "Test1" ); println "Value [" + test.name + "]" }