Introdução:

 

            Como já dissemos no artigo anterior, um Objeto em OOP assim como os objetos reais tem suas características que são chamadas, no jargão do Moose, de atributos. Em algumas linguagens os atributos são conhecidos como propriedades ou Slots.

            Os atributos no Moose possuem diversas propriedades. Essas propriedades tornam o Moose uma opção muito poderosa e legível de OOP. Vamos estudar atributos com exemplos:

·         Crie um arquivo Pet.pm;

·         Com seu editor favorito, escreva o código abaixo:

 

     1  package Pet;

     2  use Moose;

     3

     4  has name => (is => 'rw');

     5

     6  1;

 

·         Crie o arquivo my_pets.pl e adicione o código a seguir:

 

      1 use lib ".";

      2 use Pet;

      3

      4 my $cao = Pet->new;

      5 $cao->name("Frodo");

      6 printf "O name do cao eh: %s\n", $cao->name();

 

·         Execute o script:

 

 $ perl my_pets.pl

O name do cao eh: Frodo

 

            Neste exemplo nós criamos o pacote Pet.pm, que define a classe Pet quando colocamos a linha use Moose. A função has é utilizada para definir os atributos da classe. A propriedade is é utilizada para dizer ao Moose se o atributo é de leitura (ro) ou leitura-escrita (rw). Ao definir um atributo o Moose cria os métodos necessários para atribuir e ler o valor do mesmo. Esses métodos são conhecidos como acessores. O Moose pode distinguir se o acessor é de leitura ou escrita pois apenas os acessores de escrita recebem argumentos. Então: $cao->name(“Frodo”) é diferente de $cao->name( ).

            Caso eu prefira utilizar um nome diferente para os acessores deste atributo eu posso explicitamente definir os nomes dos acessores com as propriedades 'writer' e 'reader'. Então vamos modificar o exemplo anterior:

·         arquivo Pet.pm:

 

     1  package Pet;

     2  use Moose;

     3

     4  has 'name' => (is => 'rw',

     5               writer => 'set_name',

     6               reader => 'get_name');

     7

     8  1;

 

·         arquivo my_pets.pl:

 

      1 use lib ".";

      2 use Pet;

      3

      4 my $cao = Pet->new;

      5 $cao->set_name("Frodo");

      6 printf "O name do cao eh: %s\n", $cao->get_name();

 

·         execute:

$ perl my_pets.pl

O name do cao eh: Frodo

 

            Os atributos também podem ser requeridos ou opcionais. Por default todos os atributos são opcionais. Um atributo requerido deve ter seu valor informado na construção do objeto. Mesmo os métodos  opcionais podem ser informados já no construtor, mas isso não é obrigatório. Para definir um atributo ainda na construção do objeto basta informar o nome do atributo e seu valor dentro do método new.

·         Reescreva o arquivo my_pets.pl:

 

     1 use lib ".";

      2 use Pet;

      3

      4 my $cao = Pet->new(name => 'Frodo');

      5 printf "O name do cao eh: %s\n", $cao->get_name();

 

            Execute novamente e veja que a saída será a mesma.

            Para tornar um atributo em requerido colocamos a propriedade 'requerid', como o exemplo abaixo:

     4 has name => (is => 'rw',

     5               writer => 'set_name',

     6               reader => 'get_name',

     7               requied => 1); #required => 0 torna o atributo explicitamente opcional

 

            Agora se você fizer my $cao = Pet->new( ) como fizemos no início terá o erro Attribute (name) is required … Atributos requeridos são interessantes quando sabemos que todas as instâncias obrigatoriamente devem ter este atributo setado.

·         Também podemos criar um atributo com valor padrão, caso o usuário da classe não informe um valor para o atributo este receberá o valor padrão definido. Adicione estas linhas logo após o a definição de name no arquivo Pet.pm:

 

     9  has size => (is => 'ro',

    10               required => 1,

    11               reader => 'get_size',

    12               default => 'medio');

·         E adicione esta linha ao final de my_pets.pl:

 

   7 printf "O cao tem tamanho %s \n", $cao->get_size();

 

            Execute e veja que size recebeu o valor default 'medio'. O atributo default também pode receber uma referência a uma função. Assim podemos, por exemplo, fazer uma verificação detalhada do argumento enviado ao método acessor. Modifique o arquivo Pet.pm, onde declaramos o código do atributo size:

 

     9  has size => (is => 'ro',

    10               required => 1,

    11               reader => 'get_size',

    12               default => sub { my $self = shift; my $size = shift;

    13                                my @sizes = qw(pequeno medio grande);

    14                                return $size if grep ($size,@sizes);

    15                                return 'medio';});

    16

    17  1;

 

            E crie mais uma instância do objeto Pet no arquivo my_pets.pl:

 

      8

      9 my $big_dog = Pet->new(name => 'Thor', size => 'grande');

     10 printf "O meu cao %s tem tamanho %s\n", $big_dog->get_name(), $big_dog->get_size();

 

            E veja a nova saída:

 

$ perl my_pets.pl

O name do cao eh: Frodo

O cao tem tamanho medio

O meu cao Thor tem tamanho grande

 

            Espero que tenha entendido bem o conceito de atributos, pois ele é muito importante dentro do Moose. No próximo artigo iremos falar mais um pouco sobre atributos. Se quiser saber mais sobre Moose acesse: http://www.iinteractive.com/moose/. Até a próxima.