Perl Orientado a Objeto Part III
Tags: programming, braziliandevs, opensource, perl
Published: 2022-04-24 13:50:54


[Perl Orientado a Objeto Part I]
(https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1/)

[Perl Orientado a Objeto Part II](https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54)

[Perl Orientado a Objeto Part III](https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2)

[Moo - Orientação de objeto minimalista](https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el)

# *Moose*: Um jeito mais elegante de usar a Orientação a Objeto no *Perl*

O *Moose* fornece um conjunto de funções exportadas que torna o *Perl* Orientado a Objeto com uma sintaxe que funciona de maneira muito mais simples e bonita. Permitindo que voltemos nossa atenção para a abstração de dados, no lugar de focar nos detalhes de implementação.

<aside>
⚠️ Este post tem como objetivo implementar orientação a objeto com *Perl* utilizando o *Moose*,  por tanto ele leva em consideração que você, leitor, tenha conhecimento de lógica e linguagem e programação, saiba algumas definições de orientação a objeto e conheça a sintaxe básica do *Perl*.

</aside>

## Construtor e atributos com *Moose*

Seguindo a linha de raciocínio dos exemplos dos artigos passados, agora vamos implementar a classe *Performances* utilizando o *Moose* a seguir:

```perl
package Performances;

use Moose;
     
# Declare the attributes
has 'name' => (is  => 'rw', # Declare read and write at runtime
	required => 1, # make the required attribute, value = 0 optional
	default =>'No name', # Attribute default value
);

has 'audience' => (isa =>'Int', # Declare as integer
  is => 'rw',
	required => 1, 
	default => sub { 
		my $self = shift; 
		my $qtd = shift;
		return $qtd if defined $qtd and $qtd > 0;
		return 'No audience or invalid value';
	} # Attribute default value
); # Declare read and write at runtime

```

```perl
package Calculation

use lib ".";
use Performances;

# Calling the constructor and assigning value to attributes
my $performace = Performances->new(audience=>55, name=>"hamlet");

# Introducing the attributes
printf "The play presented was %s  and its audience was %d people\n ",
$performace->name, $performace->audience;
```

Como podemos observar, ao usarmos o *Moose* e definirmos os atributos *audience* e *name, o Moose* faz a criação internamente, tanto do seu construtor, quanto métodos para atribuir valor aos seus atributos e métodos de leitura. 

Para implementar relacionamentos no *Perl* vamos refatorar nossa classe de *Tragedy.* Abaixo, podemos observar a partir do código que *Tragedy* tem uma *Performance* do tipo específico de *Tragedy.*

```perl
package model::Performances::Tragedy; # Child Class
use Moose;
use lib (".");
use Performances; # Parent Class

use constant # Creating constants for play types
    TYPE_PLAY => {
        "tragedy" => 40,
        "comedy" => 60
    };

has 'performance' => {
    isa => "Performances", # Using @ISA with Moose
    is => "rw",
    default=> sub {
        return Performances->new(type_play => TYPE_PLAY->{tragedy});
    },
    required => 1
};
```

O *Moose* é uma ferramenta muito potente e além do básico que aprendemos aqui no [https://metacpan.org/](https://metacpan.org/) você pode encontrar toda a sua documentação.
Como nem tudo são flores o *Moose* também tem seus defeitos. Por ser tão potente ele por sí só já é enorme, e por isso pode deixar aplicações simples lentas. Ele gera muito código por trás da sua implementação para facilitar sua programação, então você pode pagar com processamento quando os módulos são carregados pela primeira vez.

## *Moo*: Um subconjunto do *Moose*

o *Moo* chegou para pesar menos no seu processamento. Ele implementa um subconjunto de funcionalidades do *Moose* em um pacote mais simples. Sem implementar toda a API de introspecção do *Moose* sem perder a interoperabilidade com o *Moose.* 

Caso você use o pacote de introspecção enquanto está usando o *Moo,* ele infla de maneira transparente o API do *Moose* dentro da suba classes ou função. Isso torna mais fácil incorporar *Moo* usando código em uma *Moose* base de código e vice-versa.

  

<aside>
👋🏻 Então pessoal, essa foi a implementação básica do *Moose,* recomendo que olhem as demais aplicações na sua documentação. A seguir falaremos sobre o *MOO*. Até a próxima.

</aside>