Saturday, January 24, 2009

Moose

Descobri na semana passada um plugin do CPAN chamado Moose.

Só pra dar uma descrição da ferramenta, imagina que antes desse plugin se criava uma classe de perl assim:


package SomeClass;

use strict;

use warnings;

sub new

{

my ($class, $parameter) = @_;

bless { parameter => $paremeter } $class;

}


sub parameter

{

if( scalar @_ > 1 )

{

$_[0]->{parameter} = $_[1];

}

return $_[0]->{parameter};

}


A implementação de OO de perl é um tanto quanto tosca porque ela primeiro requer que você manipule diretamente um hash fingindo que isso é um objeto. Segundo, tenho que colocar uma lógica de programação na chamada do método que não é tão fácil de entender pra quem não está acostumado com perl (e com certeza os $_[0] e $_[1] tornam o código um pouco confuso, mas isso eu podia refatorar se quisesse).


Bom, aí é que entra o Moose. A implementação da mesma classe em Moose ficaria assim:

package SomeClass;

use Moose;


has parameter => ( isa => 'Str', is => 'rw', required => 1 );


E pronto, com 3 linhas de código, o Moose já criou o método new, getters e setters e além disso já fez uma validação prévia para verificar que meu atributo parameter é uma String e que ela deve ser fornecida no construtor da classe.

Além disso, o Moose permite fazer algumas operações bem mais avançadas, como por exemplo:

  • Colocar valores padrões em campos
  • Fazer transformação de valores fornecidos para outros da forma que eu quiser, de modo que eu posso inicializar um objeto por exemplo com uma string descrevendo uma URL e esse objeto ser armazenado no objeto e obtido depois por método get como um objeto URI.
  • Definir validação para cada atributo da minha classe (fica muito fácil por exemplo criar uma enum, basta verificar que o atributo fornecido está presente em uma lista de atributos).
  • Anexar interceptors nos métodos (tipo, sempre que método A for chamado, o método B deve ser chamado logo depois).
Isso é só um exemplo do que o Moose pode fazer, mas há muito mais. Quem quiser dar uma conferida dê uma olhada no Moose Cookbook. Vale a pena.




No comments:

Post a Comment