Nos próximos artigos nós vamos aprender como programar em Perl com Orientação a Objetos. Vamos começar com alguns exemplos simples e vamos extende-los passo a passo. Começamos usando o Moose mas vamos também aprender como criar classes por outros meios.
Um construtor com o Moose
Comecemos por escrever um script simples que usa a classe
Person.
Não fazemos nada especial ainda, apenas carregamos o módulo e chamamos o
construtor
para criar uma instância
.
use strict;
use warnings;
use v5.10;
use Person;
my $teacher = Person->new;
Salve isto em somedir/bin/app.pl
Isto não deve ser novo para você, pois estou certo de que você já usou outros módulos de maneira similar. Nosso foco é em como a classe Person foi implementada:
package Person;
use Moose;
1;
É isto.
Esse código é gravado em somedir/lib/Person.pm.
Tudo o que você precisa fazer para criar uma classe
é criar um
pacote
com o nome da classe, adicionar use Moose;
a ele,
terminar o arquivo com um valor verdadeiro, e salvar em um arquivo com o mesmo
nome (sensível ao caso!) do pacote, e com a extensão .pm.
Carregar o Moose define automaticamente use strict
e use warnings
.
Isto é legal, mas cuidado para não se acostumar com essa conveniência e
esquecer de usá-los quando não estiver usando o Moose.
Carregar o Moose também adiciona automaticamente o construtor padrão chamado
new
.
Uma observação, em Perl não é um requisito que o construtor seja chamado new, mas na maioria dos casos é o que o autor acaba escolhendo.
Atributos e acessores
Ter uma classe vazia não é muito divertido. Vamos avançar um pouco em nosso uso:
use strict;
use warnings;
use v5.10;
use Person;
my $teacher = Person->new;
$teacher->name('Joe');
say $teacher->name;
Neste código, depois de criar o objeto
, chamamos o método
"name" com uma string como parâmetro; isso define o atributo
"name"
da classe como 'Joe'. Uma vez que este método define seu respectivo atributo, ele é
também chamado de setter
.
Então chamamos o mesmo método novamente, desta vez sem parâmetro algum. Isto
vai buscar o valor previamente armazenado. Uma vez que obtém um valor, este
método também é chamado getter
.
Em nosso caso o getter
e o setter
possuem o mesmo nome mas
isso também não é requisito.
Em geral getters
e setters
são chamados acessores
.
O código que implementa a nova classe é este:
package Person;
use Moose;
has 'name' => (is => 'rw');
1;
A parte nova, has 'name' => (is => 'rw');
diz que
"A classe Person tem
um atributo chamado 'name'
que tem as
permissões
de leitura(r
) e escrita(w
)"
Isso cria automaticamente um método chamado "name" que se torna ao mesmo tempo um setter (para escrita) e um getter (para leitura).
Execute o código
Com o intuito de executar este exemplo crie um diretório chamado "somedir", com um subdiretório chamado "lib" dentro dele, e salve o arquivo Person.pm dentro do subdiretório "lib". Crie também um subdiretório chamado "bin" e salve lá o script chamado person.pl.
Você deve ter
somedir/lib/Person.pm
somedir/bin/person.pl
Abra um terminal (ou a janela do cmd no Windows), acesse o diretório "somedir"
e digite perl -Ilib bin/person.pl
(No MS Windows você pode precisar usar contra-barras: \ )
Parâmetros do construtor
No próximo script nós passamos um par chave-valor para o construtor, correspondentes ao nome do atributo e seu valor.
use strict;
use warnings;
use v5.10;
use Person;
my $teacher = Person->new( name => 'Joe' );
say $teacher->name;
Isso também funciona com o mesmo módulo da mesma forma como tínhamos:
Usando o construtor dessa maneira para definir o valor inicial de um atributo funciona sem fazer qualquer mudança no módulo Person.
O Moose aceita automaticamente todo membro
(outro nome para os
atributos) a ser passado durante a construção.