O MOOSE é, em essência, uma extensão ao sistema de Programação Orientada a Objetos do Perl5. Com uma sintaxe mais elegante - baseada nas linguagens Java, Perl6 e Ruby - o MOOSE permite que o programador Perl pense mais na abstração dos dados e da classe do que em como os detalhes da classe deve ser implementada. Para utilizar o Moose no seu sistema, primeiro você deve instalar o Moose. A instalação pode ser via CPAN (Windows e Linux) ou via instalador de pacotes do seu Linux.
Para começar nossos estudos com Moose vamos utilizar o exemplo mais clássico da programação OOP. Vamos criar uma classe Ponto. Para isso cri um arquivo Ponto.pm:
$vi Ponto.pm
e adicione o seguinte código:
1 package Ponto;
2 use Moose;
3
4 #Declara os atributos x e y
5 #como inteiros para leitura e escrita
6 #ou seja, os valores podem ser modificados
7 #durante a execução do programa.
8
9 has 'x' => (isa =>'Int',
10 is => 'rw');
11
12 has 'y' => (isa => 'Int',
13 is => 'rw');
14 1;
salve o arquivo e crie outro arquivo, usa_ponto.pl
$vi usa_ponto.pl
1 use lib ".";
2 use Ponto;
3
4 my $ponto = Ponto->new;
5 $ponto->x(3);
6 $ponto->y(4);
7
8 printf "O objeto $ponto tem as coordenadas: %d e %d\n ",
9 $ponto->x, $ponto->y;
Salve o arquivo e execute o Script:
$ perl usa_ponto.pl
O objeto Ponto=HASH(0x153b28) tem as coordenadas: 3 e 4
$
Veja que, gratuitamente, o Moose criou os métodos new, x e y. Ao definirmos os atributos x e y o Moose já criou métodos para estes métodos para atribuir e ler o valor.
Conceitos de OOP com Moose:
Como o Moose tenta obter o que há de melhor no mundo OOP, ele possuí conceitos um pouco diferenciados, principalmente para programadores acostumados com a programação estruturada. Estes conceitos são classes, atributos, métodos, regras, modificadores de métodos, tipos, delegação, construção, destruição, instância, privacidade e herança.
Classe:
A classe é a própria abstração do objeto. É como um manual de montagem que diz ao Perl como construir o objeto. Quando criamos um pacote no Perl e declaramos use Moose neste pacote ele automaticamente se torna uma classe com alguns métodos e facilidades já criados pelo Moose:
Exemplo:
1 – crie o arquivo line.pl: $ vi line.pl
2- Adicione o código:
1 package Line;{
2
3 use Moose;
4 }
5 package Main;{
6 my $linha = Line->new();
7 print "O objeto linha: $linha\n"
8 }
Execute o script:
$ perl Line.pm
O objeto linha: Line=HASH(0x611728)
$
Além do método new( ), o Moose e o Perl criam diversas facilidades para a nossa classe. Para ver os detalhes, vamos ver o Objeto criado pelo Moose no debuger do perl. Digite perl -d line.pl na sua linha de comandos:
$perl -d line.pl
Loading DB routines from perl5db.pl version 1.33
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
Line::(line.pl3): use Moose;
DB<1>
No prompt do debugger envie o comando n duas vezes. Este comando executa a linha atual:
DB<1> n
DB<1> n
Isto te colocará na linha 6 do script. Onde iremos criar o objeto. O comando v mostra a região do código onde estamos:
DB<1> v
3: use Moose;
4 }
5 package Main;{
6==> my $linha = Line->new();
7: print "O objeto linha: $linha\n"
8
9 }
Execute n novamente para criar o objeto. Depois envie o comando m $linha, que irá mostrar os métodos da classe:
DB<1> n
Main::(Line.pm:7): print "O objeto linha: $linha\n"
DB<2> m $linha
after
around
augment
before
blessed
confess
extends
has
inner
meta
override
super
with
via Moose::Object: BUILDALL
via Moose::Object: BUILDARGS
via Moose::Object: DEMOLISHALL
via Moose::Object: DESTROY
via Moose::Object: DOES
via Moose::Object: does
via Moose::Object: dump
via Moose::Object: new
via UNIVERSAL: VERSION
via UNIVERSAL: can
via UNIVERSAL: isa
DB<3>
VERSION, isa e can são herdados da Classe Universal, a classe pai de todas as classes no Perl. Os outros métodos são facilidades criadas pela classe Moose::Object e pelo Moose. Toda classe criada com Moose será uma classe descendente de Universal e Moose::Object.
No próximo artigo iremos ver os conceitos: herança, atributos, métodos, tipos e regras.
Para praticar:
1 – Execute o script usa_ponto.pl dentro do Perl Debugger. Veja os métodos criados pelo Moose e compare com a saída do debugger de linha.pl.
2 – Crie uma classe Ponto3D, que tenha também a coordenada z, além de x e y.