lunes, 3 de diciembre de 2012

Metaprogramación en Groovy, hoy categorías


Groovy es un lenguaje estáticamente tipado por lo tanto no necesitamos definir los tipos; esta característica sumada a la metaprogramación puede ser muy potente.

Todos los objetos en groovy tienen una metaclass responsable de mantener la informacion de las clases. Siempre que llames a un método de un objeto, groovy utiliza un mecanismo de despacho que utiliza esta metaclass. Este mecanismo se puede modificar, groovy ofrece formas de modificarlo, por ejemplo categorías.

Las categorías es un mecanismo muy simple que sigue las siguientes reglas:

  • Los métodos estáticos son candidatos para ser métodos de categorías 
  • No es necesario implementar nuevas clases o interfaces
  • El tipo del primer parámetro, es el tipo del objeto que va a recibir el método.   

Veamos un ejemplo:

class Pouncer {
       static pounces( Integer self ){
                 (0..<self).inject("") { s, n -> s += "boing! " }
        }
}  

use( Pouncer ) {
       assert 3.pounces() == "boing! boing! boing! "
}

La magia sucede con la palabra clave use, donde decimos que la clase integer puede ejecutar pounces. El metodo se puede utilizar solo en scope de use.   Con este mecanismo podemos darle un metodo a una clase por un corto tiempo. Se podria utilizar pafra darle logica a objetos livianos.