groovy y propiedades enlazadas

hola comunidad quise hacer mi primer blog y empeze por este tema ya que estoy jugando con groovy ya un tiempesito , bueno todos sabemos que java a traves de los javabeans cuenta con PropertyChangeListeners que notifica a todos los oyentes antes registrados con (addPropertyChangeListener) de los cambios de valor de algunas de sus propiedades a traves de firePropertyChanged aqui hay un ejemplo del javabeans que llamaremos modelo

import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener;

public class Modelo{
    private String propiedad;

    PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener l) {
        pcs.add(l);
    }

    public void removePropertyChangeListener(PropertyChangeListener l) {
        pcs.remove(l);
    }

    public String getProp() {
        return prop;
    }

    public void setProp(String propiedad) {
        pcs.firePropertyChanged("propiedad", this.propiedad, this.propiedad = propiedad);
    }
}

-las clases registradas a este modelo tienen que implementar la interfaz PropertyChangeListener con su metodo

public void propertyChange(PropertyChangeEvent ev) {
       // Object source = e.getSource();
      System.out.println("la propiedad cambio")  
 }

vemos que es muy tedioso y complicado de manejar
al hacerlo con groovy ahorramos mucho codigo y el codigo es mas entendible ,algo como esto basta con añadir la anotacion @Bindable a la propiedad que deseemos detectar los cambios .

import groovy.swing.SwingBuilder
import groovy.beans.Bindable
import static javax.swing.JFrame.EXIT_ON_CLOSE

class texto_para_cambiar {
    @Bindable String text
}

def modelo = new texto_para_cambiar()

SwingBuilder.build {
    frame( title: 'ejemplo de groovy', size: [240,100], show: true,
          locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE ) {
        gridLayout cols: 1, rows: 1
       label text: bind{ modelo.text }
    }
}
modelo.text="hola java mexico"

si ejecutamos vemos que el label se actualiza ante los cambios del modelo todo en una linea a traves del metodo bind.
pero dentro del diseño grafico en el swingbuilder.

- entonces trate de hacerlo sin interfaz de usuario con puras clases , me trabe un poco pero lo logre hacer con algunos cambios

 import groovy.swing.SwingBuilder
import java.awt.BorderLayout as BL
import groovy.beans.Bindable
//import java.beans.PropertyChangeSupport;
import java.beans.PropertyChangeListener

class sapeando{
def atributo;
}

 class mirame{
@Bindable String caca='caca y pichi';
}

def sapo=new sapeando();
def miracomocambio=new mirame();

 miracomocambio.addPropertyChangeListener({
  sapo.atributo=miracomocambio.caca
  println "hacer algo"
  } as PropertyChangeListener)

println sapo.atributo;
println miracomocambio.caca;
//ahora cambiamos a caca solamente
miracomocambio.caca="caca pichi y popo"
//se cambia automaticamente la propiedad llamada atributo de sapo
println miracomocambio.caca;
println sapo.atributo;

si ejecutamos la salida sera:

null
caca y pichi
hacer algo
caca pichi y popo
caca pichi y popo

probaba con estos y no lo logre.

//bind{source:miracomocambio, sourceProperty: 'caca', target: sapo, targetProperty: 'atributo'} ;
//bean sapo,atributo: bind{ miracomocambio.caca};
les comparto este ejemplo ya que no encontraba la manera de hacerlo fuera del swingbuilder y sus componentes.