Groovy Mixins

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 + "]"
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: