<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Victoria Ricarte Bispo Beserra</title>
    <description>The latest articles on DEV Community by Victoria Ricarte Bispo Beserra (@victoriabispo).</description>
    <link>https://dev.to/victoriabispo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F805360%2F937c18b4-d367-46c7-81f0-280f7a62deb1.jpg</url>
      <title>DEV Community: Victoria Ricarte Bispo Beserra</title>
      <link>https://dev.to/victoriabispo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victoriabispo"/>
    <language>en</language>
    <item>
      <title>Orientação a Objeto com Corinna (Perl)</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Fri, 24 Jan 2025 19:18:56 +0000</pubDate>
      <link>https://dev.to/victoriabispo/orientacao-a-objeto-com-corinna-perl-478i</link>
      <guid>https://dev.to/victoriabispo/orientacao-a-objeto-com-corinna-perl-478i</guid>
      <description>&lt;p&gt;E ai galera? Depois de &lt;strong&gt;3 anos offline&lt;/strong&gt; por aqui estou de volta!🤗&lt;br&gt;
Meu último post foi voltado para &lt;a href="https://dev.to/victoriabispo/mudancas-por-aqui-54f2"&gt;mudanças por aqui&lt;/a&gt;, eu tinha começado a programar em &lt;em&gt;JavaScript&lt;/em&gt; utilizando &lt;em&gt;TypeScript&lt;/em&gt; (&lt;em&gt;NodeJS&lt;/em&gt;), um grande desafio. Tinha prometido &lt;del&gt;postar sobre essa trajetória&lt;/del&gt;, 😅 mas fiquei atarefada demais no novo trabalho. 🚨 KKKKRY&lt;br&gt;
Agora, voltando para as origens com &lt;em&gt;Perl&lt;/em&gt;, vou voltar a fazer publicações pontuais sobre o que aprendi de novo na linguagem e com o que estarei trabalhando por aqui. Vamos passear entre o &lt;em&gt;Perl&lt;/em&gt; e o &lt;em&gt;NodeJS&lt;/em&gt; durante o ano? 👩🏻‍💻&lt;/p&gt;


&lt;h2&gt;
  
  
  E para o &lt;em&gt;come back&lt;/em&gt; vamos explorar &lt;a href="https://github.com/Perl-Apollo/Corinna" rel="noopener noreferrer"&gt;&lt;em&gt;Corinna&lt;/em&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ATENÇÃO&lt;br&gt;
Este post &lt;strong&gt;não&lt;/strong&gt; tem como objetivo definir orientação a objeto nem sintaxes básicas do perl, por tanto ele leva em consideração que você, leitor, tenha conhecimento básico de perl e saiba orientação a objeto e suas definições.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A partir da versão 5.36 do &lt;em&gt;Perl&lt;/em&gt; a linguagem ganhou suporte a um sistema de &lt;strong&gt;orientação a objetos&lt;/strong&gt; que é fruto de anos de colaboração entre a equipe do &lt;em&gt;Corinna&lt;/em&gt; e a comunidade &lt;em&gt;Perl&lt;/em&gt;. Onde seu maior objetivo é simplificar a &lt;strong&gt;orientação a objetos&lt;/strong&gt; utilizando o &lt;em&gt;Perl&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A gente consegue resumir o Corinna em quatro palavras chaves que vamos utilizar dentro do nosso código fonte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;class&lt;/em&gt;: Para declarar uma classe;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;field&lt;/em&gt;: Para declarar um atributo (campo);&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;method&lt;/em&gt;: Para declarar um método;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;role&lt;/em&gt;: Para declarar uma função;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Aplicação
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é garantir que a versão do &lt;em&gt;Perl&lt;/em&gt; que estamos utilizando. Como disse anteriormente precisamos de uma versão a cima da 5.36. Em seguida adicione no seu script &lt;code&gt;use experimental 'class';&lt;br&gt;
&lt;/code&gt; para ativar o experimental &lt;em&gt;Corinna&lt;/em&gt;. &lt;br&gt;
E para começar a implementação de maneira simples vamos declarar a nossa primeira classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;...&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para criar uma instância do objeto basta utilizar a seguinte sintaxe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Passando dentro dos parênteses os atributos que vamos ter declarados dentro da nossa classe.&lt;br&gt;
Na sequência temos a declaração dos atributos, de maneira também muito simples utilizando a palavra chave &lt;em&gt;field&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além de declarar os nossos atributos vamos precisar adicionar modificadores. Quando definimos apenas com o &lt;em&gt;field&lt;/em&gt; ele é criado como uma propriedade privada da nossa classe e para serem acessados e/ou modificados de maneira mais simples podemos utilizar esses modificadores para personalizar seus comportamentos: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;:reader&lt;/em&gt; : Para gerar automaticamente um método de leitura; &lt;/li&gt;
&lt;li&gt;
&lt;em&gt;:writer&lt;/em&gt; : Para gerar automaticamente um método de escrita;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;:param&lt;/em&gt; : Para inicializar o atributo diretamente no construtor;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;:default&lt;/em&gt; : Para definir um valor padrão;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;:lazy&lt;/em&gt; : Utilizado com &lt;em&gt;default&lt;/em&gt;, faz com que o valor padrão seja calculado &lt;strong&gt;apenas&lt;/strong&gt; na primeira vez que o atributo é acessado;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;:builder&lt;/em&gt; : Para definir um método que será chamado para inicializar ele;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A seguir vou mostrar como podemos utilizar cada modificador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;ativo&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$criado_em&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Testando&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Victoria&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;victoria@example.com&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Atualizando o email&lt;/span&gt;
&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;nova@example.com&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Email atualizado: &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executarmos o nosso script lembre sempre de salvar com uma extensão &lt;em&gt;.pl&lt;/em&gt; como por exemplo &lt;em&gt;main.pl&lt;/em&gt; e execute utilizando o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;perl main.pl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para implementar um novo método, basta declarar utilizando a palavra &lt;em&gt;mothod&lt;/em&gt; e para utilizar basta chamar utilizamos &lt;code&gt;-&amp;gt;methodName()&lt;/code&gt; na classe que instanciamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;ativo&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$criado_em&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;# Método&lt;/span&gt;
    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;exibir_detalhes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nome: &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email: &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status: &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Criado em: &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nb"&gt;scalar&lt;/span&gt; &lt;span class="nb"&gt;localtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;$criado_em&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;# Testando&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Victoria&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;victoria@example.com&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;exibir_detalhes&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem comportamentos e atributos que precisamos compartilhar entre classes, mas essas classes não estão relacionadas diretamente por herança. Para não repetirmos código, evitar problemas de herança múltipla e separar corretamente as responsabilidades podemos utilizar &lt;em&gt;role&lt;/em&gt;. Por exemplo, um comportamento como "validar dados" ou "logar ações" pode ser usado por diferentes classes. Para utilizar uma &lt;em&gt;role&lt;/em&gt; basta utilizarmos &lt;em&gt;does&lt;/em&gt; após o nome da classe, e é possível utilizarmos mais de uma &lt;em&gt;role&lt;/em&gt; nas classes como veremos aqui embaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.36&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;experimental&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;


&lt;span class="nv"&gt;role&lt;/span&gt; &lt;span class="nv"&gt;Loggable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[LOG]: &lt;/span&gt;&lt;span class="si"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;role&lt;/span&gt; &lt;span class="nv"&gt;Validacoes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;validarEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email inválido&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;validarPreco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$preco&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Preço inválido: deve ser positivo&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;$preco&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$preco&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt; &lt;span class="nv"&gt;does&lt;/span&gt; &lt;span class="nv"&gt;Loggable&lt;/span&gt; &lt;span class="nv"&gt;does&lt;/span&gt; &lt;span class="nv"&gt;Validacoes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$senha&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;ativo&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$criado_em&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;lazy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;logarUsuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$senha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;validarEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Usa o método do role&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;Pessoa logado com Sucesso!&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt; &lt;span class="c1"&gt;# Usa o método do role&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Produto&lt;/span&gt; &lt;span class="nv"&gt;does&lt;/span&gt; &lt;span class="nv"&gt;Loggable&lt;/span&gt; &lt;span class="nv"&gt;does&lt;/span&gt; &lt;span class="nv"&gt;Validacoes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$nome&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$descricao&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;field&lt;/span&gt; &lt;span class="nv"&gt;$preco&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;reader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;writer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;param&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


    &lt;span class="nv"&gt;method&lt;/span&gt; &lt;span class="nv"&gt;cadastrarProduto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$descricao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$preco&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;validarPreco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$preco&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;# Usa o método do role&lt;/span&gt;
        &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;Produto cadastrado com Sucesso!&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt; &lt;span class="c1"&gt;# Usa o método do role&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Testando&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Victoria&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;victoria@example.com&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;logarUsuario&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;victoria@example.com&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;123456&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Caderno&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;descricao&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200 folhas e 5 matérias&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;30.50&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$produto&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;cadastrarProduto&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;Caderno&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;200 folhas e 5 matérias&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="mf"&gt;30.50&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hoje a gente fica por aqui
&lt;/h3&gt;

&lt;p&gt;Aprendemos como usar as quatro palavras chaves do Corinna para a POO com Perl, e em breve vou trazer para vocês novas implementações com mais complexidade e soluções incríveis. Até a próxima.&lt;/p&gt;

&lt;p&gt;Fontes: &lt;br&gt;
Repositório do Corinna no GitHub: Este repositório centraliza discussões e propostas para integrar um sistema OO moderno ao núcleo do Perl.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Perl-Apollo/Corinna" rel="noopener noreferrer"&gt;GITHUB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Corinna no Perl Core: Artigo que discute a integração do Corinna ao núcleo do Perl, destacando suas vantagens e implicações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://curtispoe.org/articles/corinna-in-the-perl-core.html" rel="noopener noreferrer"&gt;OVID'S PROGRAMMING, POLITICS, AND PROSE&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Corinna "Quickstart" Tutorial: Um tutorial introdutório que oferece uma visão geral prática do uso do Corinna para programação OO em Perl.&lt;br&gt;
&lt;a href="https://gist.github.com/Ovid/e0381355da7136654e92418a43c97611" rel="noopener noreferrer"&gt;GITHUB&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
      <category>mojolicious</category>
      <category>corinna</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Mudanças por aqui…</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Sun, 29 May 2022 17:32:26 +0000</pubDate>
      <link>https://dev.to/victoriabispo/mudancas-por-aqui-54f2</link>
      <guid>https://dev.to/victoriabispo/mudancas-por-aqui-54f2</guid>
      <description>&lt;p&gt;Muito se vê na internet sobre como entrar no mundo da T.I., mudar de carreira, migrar de área, aprender uma tecnologia do zero ao avançado. Mas, particularmente, não encontrei por acaso nenhuma publicação sobre mudanças dentro da própria carreira como por exemplo: Migrar de tecnologia, que é uma realidade muito comum dentro da nossa área. Eu, por exemplo, sou programadora a 4 anos. E no meio dessa jornada tive que migrar de linguagem de programação 3 vezes. &lt;/p&gt;

&lt;p&gt;Comecei minha carreira logo após terminar a faculdade de Sistemas de Informação em uma empresa pequena. Lá aprendi do zero uma linguagem de programação que não conhecia na época da faculdade, o Delphi. Trabalhei com Delphi em um CRM com código legado por dois anos, cuidado dos processos desde a coleta de requisitos, passando pela modelagem e banco de dados até a programação e testes da aplicação. Foi uma experiência enriquecedora, entretanto para crescer na carreira tive que mudar de emprego.&lt;/p&gt;

&lt;p&gt;Quando entrei na minha nova empresa fui trabalhar com Perl também em um sistema legado, me vi mais uma vez tendo que aprender algo do zero. Logo passei a gostar bastante do Perl, e ele me impulsionou a começar a publicar aqui.&lt;/p&gt;

&lt;p&gt;Hoje, me encontro novamente em posição de mudanças. Iniciando meus estudos com NodeJS para, com uma equipe bem estruturada, reescrever o sistema de um cliente. &lt;/p&gt;

&lt;p&gt;Claro que para um profissional da área da T.I é sempre mais simples assimilar novas tecnologias dado que já se tem uma boa base de lógica de programação e algoritmos. Mas cada pessoa tem uma metodologia e tempo diferentes para aprender e aperfeiçoar as suas skills.&lt;/p&gt;

&lt;p&gt;No decorrer dos meus estudos estarei publicando aqui os caminhos que vou seguir para aprender essa nova tecnologia. Vamos embarcar nessa comigo?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>challenge</category>
      <category>node</category>
    </item>
    <item>
      <title>Mojolicious</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Mon, 16 May 2022 22:45:44 +0000</pubDate>
      <link>https://dev.to/victoriabispo/mojolicious-12j</link>
      <guid>https://dev.to/victoriabispo/mojolicious-12j</guid>
      <description>

&lt;p&gt;Durante um ano e meio trabalhei com o &lt;em&gt;mojolicious&lt;/em&gt; em um projeto legado dentro de uma empresa de telecomunicações. Aprendi a fazer diversas coisas com ele e hoje vim contar para vocês como ele funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;O &lt;em&gt;mojolicious&lt;/em&gt; é um &lt;em&gt;framework&lt;/em&gt; composto de um conjunto de componentes para desenvolvimento Web em tempo real com &lt;em&gt;Perl&lt;/em&gt; usando um MVC bem estruturado. Abaixo podemos observar alguns dos seus recursos disponíveis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementação cliente/servidor HTTP e &lt;em&gt;WebSocket&lt;/em&gt; com IPv6, TLS, SNI, IDNA, &lt;em&gt;proxy&lt;/em&gt; HTTP/SOCKS5, &lt;em&gt;socket&lt;/em&gt; de domínio UNIX, &lt;em&gt;Comet (long polling), Promises&lt;/em&gt;/A+, &lt;em&gt;async/await&lt;/em&gt;, &lt;em&gt;keep-alive&lt;/em&gt;, &lt;em&gt;timeout&lt;/em&gt;, suporte a compressão &lt;em&gt;cookie&lt;/em&gt;, &lt;em&gt;multipart&lt;/em&gt; e &lt;em&gt;gzip&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Servidor da Web de E/S sem bloqueio integrado, com suporte a vários &lt;em&gt;loops&lt;/em&gt; de eventos, bem como pré-bifurcação opcional, perfeito para criar serviços da &lt;em&gt;Web&lt;/em&gt; altamente escaláveis.&lt;/li&gt;
&lt;li&gt;Analisador JSON e HTML/XML com suporte a seletores CSS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como usar?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Perlbrew
&lt;/h3&gt;

&lt;p&gt;Recomendo que como primeiro passo para programar em &lt;em&gt;Perl&lt;/em&gt; baixem o gerenciador de instalação &lt;a href="https://perlbrew.pl/"&gt;&lt;em&gt;Perlbrew&lt;/em&gt;&lt;/a&gt;. Ele vai te ajuda-los a ter várias versões do &lt;em&gt;perl&lt;/em&gt; instaladas no seu computador e te auxiliar a administra-las de maneira bem simples.&lt;/p&gt;

&lt;p&gt;Para instalar o &lt;em&gt;Perlbrew&lt;/em&gt; basta executar o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://install.perlbrew.pl | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para instalar a versão estável mais recente e usá-la a partir de agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew &lt;span class="nb"&gt;install &lt;/span&gt;perl-5.34.0
&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew switch perl-5.34.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para programar com a versão mais atualizada, mas apenas no terminal atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew &lt;span class="nb"&gt;install &lt;/span&gt;perl-blead
&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew use perl-blead
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para executar &lt;em&gt;meuprograma.pl&lt;/em&gt; em todas as instalações do perl, muito útil ao fazer testes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew &lt;span class="nb"&gt;exec &lt;/span&gt;perl meuprograma.pl

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para a folha de dicas de uso básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew &lt;span class="nt"&gt;-h&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para mais descrições sobre comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;perlbrew &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;A instalação do &lt;em&gt;mojolicious&lt;/em&gt; pode ser feita de maneira rápida no terminal por meio de apenas uma linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://cpanmin.us | perl - &lt;span class="nt"&gt;-M&lt;/span&gt; https://cpan.metacpan.org &lt;span class="nt"&gt;-n&lt;/span&gt; Mojolicious
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hello Word!
&lt;/h3&gt;

&lt;p&gt;Como prometido, abaixo mostro a vocês como é simples escrever uma aplicação Web completa com o &lt;em&gt;mojolicious&lt;/em&gt; utilizando apenas as linhas a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Mojolicious::&lt;/span&gt;&lt;span class="nv"&gt;Lite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;get&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Word!&lt;/span&gt;&lt;span class="p"&gt;'};&lt;/span&gt;

&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basta salvar o arquivo com a extensão .pl e executa-lo usando &lt;em&gt;morbo&lt;/em&gt; para inicia-lo com servidor web integrado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;morbo hello.pl
Web application available at http://127.0.0.1:3000

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://127.0.0.1:3000/
Hello Word!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👋🏻 Então pessoal, como viram a cima usar o &lt;em&gt;mojolícious&lt;/em&gt; não é tão difícil, e como disse no começo ele pode nos ajudar em diversas coisas. Nos próximos posts irei ensinar a vocês todos os principais recursos desse &lt;em&gt;framework&lt;/em&gt; e as classes que o compõem. fiquem ligados para os próximos posts. Até a próxima.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>opensource</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Moo - Orientação de objeto minimalista</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Tue, 26 Apr 2022 15:55:16 +0000</pubDate>
      <link>https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el</link>
      <guid>https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el</guid>
      <description>

&lt;p&gt;Como começar a programar em &lt;strong&gt;&lt;em&gt;Perl&lt;/em&gt;&lt;/strong&gt; da maneira correta. &lt;del&gt;(Diferente de mim)&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1/"&gt;Perl Orientado a Objeto Part I&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54"&gt;Perl Orientado a Objeto Part II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2"&gt;Perl Orientado a Objeto Part III&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el"&gt;Moo - Orientação de objeto minimalista&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o &lt;em&gt;Moo&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Diferente do &lt;em&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2"&gt;Moose&lt;/a&gt;&lt;/em&gt;, que vimos anteriormente, o &lt;em&gt;Moo&lt;/em&gt; é um sistema de orientação a objetos extremamente leve. Permitindo definições de objetos e funções de maneira bem simples. Tem um sub-conjunto do &lt;em&gt;Moose o Moo&lt;/em&gt; evita depender de qualquer módulo XS para permitir implantações simples. Fornece quase dois terços do &lt;em&gt;Moose.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar o &lt;em&gt;Moo&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Como dito a cima, o &lt;em&gt;Moo&lt;/em&gt; deve ser utilizado quando a aplicação preza por rapidez ao carregar pacotes e não tem necessidade de utilização de todos os metaprotocolos do &lt;em&gt;Moose.&lt;/em&gt; A seguir exemplifico alguns casos que o podemos escolher o &lt;em&gt;Moo:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando uma linha de comando ou script CGI onde a inicialização rápida é essencial;&lt;/li&gt;
&lt;li&gt;Código projetado para ser implantado como um único arquivo via &lt;a href="https://metacpan.org/pod/App::FatPacker"&gt;App::FatPacker&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Um módulo CPAN que pode ser usado por outros nas situações acima;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Incompatibilidades do &lt;em&gt;Moo&lt;/em&gt; para o &lt;em&gt;Moose&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Se o &lt;em&gt;Moo&lt;/em&gt; detectar que o &lt;em&gt;Moose&lt;/em&gt; está sendo carregado, ele registrará automaticamente metaclasses para seus pacotes &lt;em&gt;Moo&lt;/em&gt; , então você poderá usá-los no código do &lt;em&gt;Moose&lt;/em&gt; sem modificação.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;Moo&lt;/em&gt; não dará suporte para &lt;em&gt;initializer, super, override, inner e augment&lt;/em&gt; pelos seus criadores considerarem más idéias ou práticas de programação no &lt;em&gt;Perl.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o Moo nos exemplos dos artigos anteriores
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Moo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Declare the attributes&lt;/span&gt;
&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Declare read and write at runtime&lt;/span&gt;
    &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No name&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Attribute default value&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;isa&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Declare as integer&lt;/span&gt;
  &lt;span class="s"&gt;is&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;
  &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No audience or invalid value&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# Attribute default value&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;# Declare read and write at runtime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Sub-rotinas importadas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Extends
&lt;/h3&gt;

&lt;p&gt;Declara uma classe base. A classe será carregada, mas nenhum erro será acionado se a classe não puder ser encontrada e já houver subs na classe.&lt;/p&gt;

&lt;p&gt;Chamar &lt;em&gt;extends&lt;/em&gt; mais de uma vez irá SUBSTITUIR suas superclasses, não adicionar a elas como '&lt;em&gt;use base'&lt;/em&gt; ou &lt;em&gt;‘use parent’&lt;/em&gt; faria.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;extends&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Performances::Tragedy&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Performances::Comedy&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Indica que a classe atual compõe uma ou mais funções da &lt;em&gt;Performances&lt;/em&gt; &lt;a href="https://metacpan.org/pod/Moo::Role"&gt;&lt;/a&gt;. Um erro será gerado se essas funções não puderem ser compostas porque possuem definições de método conflitantes. As funções serão carregadas usando o mesmo mecanismo que os &lt;em&gt;extends&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Has
&lt;/h3&gt;

&lt;p&gt;Declara um atributo para a Classe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Obrigatório para a declaração , pode ser &lt;em&gt;ro, lazy, rwp&lt;/em&gt; ou &lt;em&gt;rw.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;ro&lt;/em&gt; - significa "somente leitura" e gera um acessador que morre se você tentar escrever nele - ou seja, apenas um &lt;em&gt;getter&lt;/em&gt; - padronizando &lt;em&gt;reader&lt;/em&gt; o nome do atributo.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;lazy&lt;/em&gt; - gera um leitor como &lt;em&gt;ro&lt;/em&gt;, mas também define &lt;em&gt;lazy&lt;/em&gt;  como 1 e &lt;em&gt;builder&lt;/em&gt; como &lt;em&gt;&lt;em&gt;build&lt;/em&gt;${attribute_name&lt;/em&gt;} permitir atributos gerados sob demanda.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;rwp&lt;/em&gt; -significa "ler-escrever protegido" e gera um leitor como &lt;em&gt;ro&lt;/em&gt;, mas também define &lt;em&gt;writer&lt;/em&gt; para &lt;em&gt;&lt;em&gt;set&lt;/em&gt;${attribute_name}&lt;/em&gt; atributos que são projetados para serem escritos de dentro da classe, mas somente leitura de fora.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;rw&lt;/em&gt; - significa "ler-escrever" e gera um &lt;em&gt;getter/setter&lt;/em&gt; normal padronizando o &lt;em&gt;accessor&lt;/em&gt; o nome do atributo especificado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;isa&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um &lt;em&gt;coderef&lt;/em&gt; que é usado para validar o atributo. Ao contrário do &lt;em&gt;Moose&lt;/em&gt;, o &lt;em&gt;Moo&lt;/em&gt; não inclui um sistema de tipo básico, então ao invés de fazer &lt;em&gt;isa ⇒ ‘str’&lt;/em&gt;, deve-se fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;# Declare the attributes&lt;/span&gt;
&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Declare read and write at runtime&lt;/span&gt;
    &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No name&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;
    &lt;span class="s"&gt;isa&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;[0] is not a name!&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;looks_like_name&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# Attribute type&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;coerce&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um coderef que se destina a coagir o atributo. A ideia básica é fazer algo como o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;# Declare the attributes&lt;/span&gt;
&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;isa&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;[0] is not a number!&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;looks_like_number&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;coerce&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# Attribute type for audience always ever &lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que o &lt;em&gt;Moo&lt;/em&gt; sempre executará sua coerção: isso é para permitir que &lt;em&gt;as&lt;/em&gt; entradas de &lt;em&gt;isa&lt;/em&gt; sejam usadas puramente para captura de bugs, enquanto as coerções são sempre estruturais para seu código. No entanto, aplicamos a verificação de isa após a execução da coerção para garantir que ela retornou um valor válido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;trigger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um coderef que será chamado sempre que o atributo for definido. Isso inclui o construtor, mas não os valores padrão ou construídos. O coderef será invocado no objeto com o novo valor como argumento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;default&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um &lt;em&gt;coderef&lt;/em&gt; que será chamado com &lt;em&gt;$self&lt;/em&gt; como seu único argumento para preencher um atributo se nenhum valor para esse atributo for fornecido ao construtor. Como alternativa, se o atributo for &lt;em&gt;lazy&lt;/em&gt;, será &lt;em&gt;default&lt;/em&gt; executado quando o atributo for recuperado pela primeira vez se nenhum valor ainda tiver sido fornecido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;predicate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um nome de método que retornará true se um atributo tiver um valor. Se você definir  como apenas 1, o &lt;em&gt;predicate&lt;/em&gt; será nomeado automaticamente &lt;em&gt;has_${attr_name}&lt;/em&gt; se o nome do seu atributo não começar com um sublinhado ou &lt;em&gt;has_${attr_name_without_underscore}&lt;/em&gt; se começar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;clear&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um nome de método que limpará o atributo. Se você definir  como apenas 1, o &lt;em&gt;clear&lt;/em&gt; será nomeado automaticamente &lt;em&gt;clear_${attr_name&lt;/em&gt;} se o nome do seu atributo não começar com um sublinhado ou  &lt;em&gt;&lt;em&gt;clear&lt;/em&gt;${attr_name_without_the_underscore}&lt;/em&gt; se começar. &lt;br&gt;
&lt;strong&gt;NOTA:&lt;/strong&gt; Se o atributo for &lt;em&gt;laze&lt;/em&gt;, ele será gerado novamente &lt;em&gt;default ou&lt;/em&gt;  &lt;em&gt;buider&lt;/em&gt; na próxima vez que for acessado. Se não for, será &lt;em&gt;undef&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lazy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um booleano. Definir se desejar que os valores do atributo sejam capturados lentamente. Isso geralmente é uma boa ideia se você tiver um &lt;a href="https://metacpan.org/pod/Moo#builder"&gt;"construtor"&lt;/a&gt; que requer que outro atributo seja definido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;required&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um booleano . Definir se o atributo deve ser passado na instanciação do objeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reader&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O valor deste atributo será p nome do método que retorna o valor do atributo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;writer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O valor deste atributo será o nome do método para definir o valor do atributo. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;weak_ref&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um booleano . Definir se desejar que a referência que o atributo contém seja enfraquecida. Use isso quando referências circulares, que causam vazamentos de memória, são possíveis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;init_arg&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe o nome da chave a ser procurada no momento da instanciação do objeto. Um uso comum disso é fazer com que um atributo sublinhado tenha um nome de inicialização não sublinhado. &lt;em&gt;undef&lt;/em&gt; significa que passar o valor na instanciação é ignorado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;moosify&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recebe um &lt;em&gt;coderef&lt;/em&gt; ou uma matriz de &lt;em&gt;coderefs&lt;/em&gt; que se destina a transformar as especificações de atributos fornecidas, se necessário, ao atualizar para uma função ou classe &lt;em&gt;Moose&lt;/em&gt;. Você não deve precisar disso por padrão, mas é fornecido como um meio de extensibilidade possível.&lt;/p&gt;

&lt;h3&gt;
  
  
  before, around e after
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;before&lt;/strong&gt; chamado antes do método que está modificando. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;around&lt;/strong&gt; chamado em vez do método que está modificando. O método que você está substituindo é passado como o primeiro argumento (chamado $orig por convenção). Cuidado com os valores de retorno contextuais de $orig.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;after&lt;/strong&gt; é chamado após o método que está modificando. &lt;/p&gt;

&lt;p&gt;👋🏻 Então pessoal, hoje definimos o &lt;em&gt;Moo,&lt;/em&gt; mostramos onde ele pode ser usado e quais suas incompatibilidades com o &lt;em&gt;Moose&lt;/em&gt;. Qualquer dúvida, ou sugestão para os próximos artigos, podem deixar nos comentários. Até a próxima.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>opensource</category>
      <category>braziliandevs</category>
      <category>oop</category>
    </item>
    <item>
      <title>Perl Orientado a Objeto Part III</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Sun, 24 Apr 2022 13:50:54 +0000</pubDate>
      <link>https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2</link>
      <guid>https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1/"&gt;Perl Orientado a Objeto Part I&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54"&gt;Perl Orientado a Objeto Part II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2"&gt;Perl Orientado a Objeto Part III&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el"&gt;Moo - Orientação de objeto minimalista&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;em&gt;Moose&lt;/em&gt;: Um jeito mais elegante de usar a Orientação a Objeto no &lt;em&gt;Perl&lt;/em&gt;
&lt;/h1&gt;

&lt;p&gt;O &lt;em&gt;Moose&lt;/em&gt; fornece um conjunto de funções exportadas que torna o &lt;em&gt;Perl&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;⚠️ Este post tem como objetivo implementar orientação a objeto com &lt;em&gt;Perl&lt;/em&gt; utilizando o &lt;em&gt;Moose&lt;/em&gt;,  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 &lt;em&gt;Perl&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construtor e atributos com &lt;em&gt;Moose&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Seguindo a linha de raciocínio dos exemplos dos artigos passados, agora vamos implementar a classe &lt;em&gt;Performances&lt;/em&gt; utilizando o &lt;em&gt;Moose&lt;/em&gt; a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Moose&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Declare the attributes&lt;/span&gt;
&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Declare read and write at runtime&lt;/span&gt;
    &lt;span class="s"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# make the required attribute, value = 0 optional&lt;/span&gt;
    &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No name&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Attribute default value&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;isa&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="c1"&gt;# Declare as integer&lt;/span&gt;
  &lt;span class="s"&gt;is&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;
    &lt;span class="s"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
        &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;$qtd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No audience or invalid value&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# Attribute default value&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;# Declare read and write at runtime&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nv"&gt;Calculation&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;lib&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Calling the constructor and assigning value to attributes&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$performace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;audience&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hamlet&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt;

&lt;span class="c1"&gt;# Introducing the attributes&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The play presented was %s  and its audience was %d people&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt;
&lt;span class="nv"&gt;$performace&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$performace&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Para implementar relacionamentos no &lt;em&gt;Perl&lt;/em&gt; vamos refatorar nossa classe de &lt;em&gt;Tragedy.&lt;/em&gt; Abaixo, podemos observar a partir do código que &lt;em&gt;Tragedy&lt;/em&gt; tem uma &lt;em&gt;Performance&lt;/em&gt; do tipo específico de &lt;em&gt;Tragedy.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::Performances::&lt;/span&gt;&lt;span class="nv"&gt;Tragedy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Child Class&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Moose&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;lib&lt;/span&gt; &lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="p"&gt;");&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Parent Class&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt; &lt;span class="c1"&gt;# Creating constants for play types&lt;/span&gt;
    &lt;span class="s"&gt;TYPE_PLAY&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tragedy&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;comedy&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;has&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;isa&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="c1"&gt;# Using @ISA with Moose&lt;/span&gt;
    &lt;span class="s"&gt;is&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rw&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt;
    &lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;type_play&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;TYPE_PLAY&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;tragedy&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="s"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;em&gt;Moose&lt;/em&gt; é uma ferramenta muito potente e além do básico que aprendemos aqui no &lt;a href="https://metacpan.org/"&gt;https://metacpan.org/&lt;/a&gt; você pode encontrar toda a sua documentação.&lt;br&gt;
Como nem tudo são flores o &lt;em&gt;Moose&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Moo&lt;/em&gt;: Um subconjunto do &lt;em&gt;Moose&lt;/em&gt;
&lt;/h2&gt;

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

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

&lt;p&gt;👋🏻 Então pessoal, essa foi a implementação básica do &lt;em&gt;Moose,&lt;/em&gt; recomendo que olhem as demais aplicações na sua documentação. A seguir falaremos sobre o &lt;em&gt;MOO&lt;/em&gt;. Até a próxima.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>braziliandevs</category>
      <category>opensource</category>
      <category>perl</category>
    </item>
    <item>
      <title>Perl Orientado a Objeto Part II</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Sat, 23 Apr 2022 13:09:49 +0000</pubDate>
      <link>https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54</link>
      <guid>https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54</guid>
      <description>

&lt;p&gt;Como começar a programar em &lt;strong&gt;Perl&lt;/strong&gt; da maneira correta. &lt;del&gt;(Diferente de mim)&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1/"&gt;Perl Orientado a Objeto Part I&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54"&gt;Perl Orientado a Objeto Part II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2"&gt;Perl Orientado a Objeto Part III&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el"&gt;Moo - Orientação de objeto minimalista&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Os 4 pilares da Programação Orientada a Objetos
&lt;/h1&gt;

&lt;p&gt;Abstração, encapsulamento, herança e polimorfismo são os quatro pilares de qualquer linguagem orientada a objetos. E como aprendemos no &lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1"&gt;post passado&lt;/a&gt; o Perl é uma linguagem que da suporte a orientação a objeto a partir da sua versão 5. A seguir vou dar exemplos a vocês de como podemos implementar esses pilares.&lt;/p&gt;

&lt;p&gt;⚠️ Este post não tem como objetivo definir orientação a objeto com Perl, mas sim aprofundar conhecimentos prévios que você tenha baseando-se na linguagem. por tanto ele leva em consideração que você, leitor, tenha conhecimento de lógica e linguagem e programação e saiba algumas definições de orientação a objeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstração
&lt;/h2&gt;

&lt;p&gt;O primeiro pilar fala sobre como vamos representar os objetos dentro no nosso programa, é o que Moose é uma extensão do sistema de objetos da linguagem de programação Perl . Seu propósito declarado [1] é trazer recursos modernos de linguagem orientada a objetos para o Perl 5 e tornar a programação Perl orientada a objetos mais consistente e menos tediosa.vai também facilitar a leitura do nosso código por terceiro. É importante ter clareza ao dar nome a nossas Classes, Atributos e Métodos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Encapsulamento
&lt;/h2&gt;

&lt;p&gt;O encapsulamento trata da segurança das partes do seu programa. Quem implementa suas classes com seus atributos e usa seus métodos não precisa saber de tudo que se passa dentro da sua construção a não ser o que está na sua API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polimorfismo
&lt;/h2&gt;

&lt;p&gt;O polimorfismo é referente a capacidade que a linguagem tem de identificar e diferenciar entidades, métodos ou atributos com mesmo nome de maneira eficiente.&lt;/p&gt;

&lt;p&gt;A seguir irei mostrar os principais polimorfismos em Perl:&lt;/p&gt;

&lt;h3&gt;
  
  
  Substituição
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Error readability&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;controller::&lt;/span&gt;&lt;span class="nv"&gt;Calculation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;model::&lt;/span&gt;&lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# We declare entity and assign the value of tragedy with its attributes&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;model::Performances::&lt;/span&gt;&lt;span class="nv"&gt;Tragedy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;othelo&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="c1"&gt;# Then we replace entity with the value returned from one of its methods&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$entity&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;amount_for&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sobrecarga
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Error readability&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::Performances::&lt;/span&gt;&lt;span class="nv"&gt;Tragedy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Child Class&lt;/span&gt;

&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;parent&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;  &lt;span class="c1"&gt;# Parent Class &lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# writing over the Performances builder&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$audience&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$audience&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;TYPE_PLAY&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;tragedy&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bless&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inclusão
&lt;/h3&gt;

&lt;p&gt;Que é o tipo de polimorfismo de herança que veremos a seguir. &lt;/p&gt;

&lt;h2&gt;
  
  
  Herança
&lt;/h2&gt;

&lt;p&gt;E é aqui onde o POO ganha meu coração🥰&lt;br&gt;
É com a herança que podemos aplicar a abstração e o encapsulamento para melhorar nossos códigos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evitando repetições “herdando” métodos semelhantes ou re-escrevendo os mesmos;&lt;/li&gt;
&lt;li&gt;Utilizando os mesmos atributos para diferentes classes (não tão diferentes assim) para evitar classes de linhas quilométricas;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A herança no Perl pode ser implementada com o uso de pacotes no seu código, que como aprendemos anteriormente, os pacotes serão as classes. Cada pacote em perl tem um array especial chamado &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/isa"&gt;@isa&lt;/a&gt;&lt;/em&gt; que guarda toda a hierarquia de classes pai daquela classe. Veja o código a seguir, continuando a linha de raciocínio anterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Error readability&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt; &lt;span class="c1"&gt;# Creating constants for play types&lt;/span&gt;
    &lt;span class="s"&gt;TYPE_PLAY&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tragedy&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::Performances::&lt;/span&gt;&lt;span class="nv"&gt;Tragedy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Child Class&lt;/span&gt;
&lt;span class="nv"&gt;@&lt;/span&gt;&lt;span class="nn"&gt;Performances::Tragedy::&lt;/span&gt;&lt;span class="nv"&gt;ISA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt; &lt;span class="c1"&gt;# Parent Class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A atribuição feita na linha “@Performances::Tragedy::ISA = ('Performances');” indica que a classe Tragedy é uma filha da classe Perfomances, por tanto herda todos seus atributos e sub-rotinas.&lt;/p&gt;

&lt;p&gt;Entretanto não existe a necessidade de atribuirmos diretamente ao array &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/isa"&gt;@isa&lt;/a&gt;&lt;/em&gt; todas as heranças de nossas classes, dado que em um sistema mais complexo que possa envolver enrança múltipla ou que a arvore de herança fique muito grande, possamos encontrar dificuldades. Mas ainda podemos encontrar essas atribuições em códigos antigos.&lt;/p&gt;

&lt;p&gt;Além de atribuir diretamente ao &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/isa"&gt;@isa&lt;/a&gt;&lt;/em&gt;, podemos encontrar o uso de &lt;em&gt;base&lt;/em&gt; para indicar herança dentro do Perl. Porém esse uso não é mais aconselhado a partir do momento que foi criado o &lt;em&gt;parent,&lt;/em&gt; que é uma versão do &lt;em&gt;base&lt;/em&gt; mais limpa. A seguir podemos observar um exemplo de como usar o &lt;em&gt;parent&lt;/em&gt; na classe Comedy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Error readability&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;constant&lt;/span&gt; &lt;span class="c1"&gt;# Creating constants for play types&lt;/span&gt;
    &lt;span class="s"&gt;TYPE_PLAY&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tragedy&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;comedy&lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::Performances::&lt;/span&gt;&lt;span class="nv"&gt;Comedy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# Class&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;parent&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;    &lt;span class="c1"&gt;# sets @Performances::Comedy::ISA = ('Performances');&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Principais características de &lt;em&gt;base&lt;/em&gt; e &lt;em&gt;parent:&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;&lt;a href="http://perldoc.perl.org/base.html"&gt;base&lt;/a&gt;&lt;/em&gt; faz as seguintes coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adiciona o pacote nomeado a &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/isa"&gt;@isa&lt;/a&gt;;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Carrega o módulo com o mesmo nome do pacote nomeado usando &lt;em&gt;&lt;a href="https://perldoc.perl.org/functions/require"&gt;require&lt;/a&gt;&lt;/em&gt; (a menos que detecte que o pacote já foi carregado);&lt;/li&gt;
&lt;li&gt;Não falhará se um módulo com o mesmo nome do pacote não existir;&lt;/li&gt;
&lt;li&gt;Morre se não houver símbolos no pacote nomeado;&lt;/li&gt;
&lt;li&gt;Inicializa o &lt;em&gt;[fields]&lt;a href="http://perldoc.perl.org/fields.html"&gt;http://perldoc.perl.org/fields.html&lt;/a&gt;)&lt;/em&gt; do pacote nomeado se eles existirem;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;em&gt;&lt;a href="http://search.cpan.org/dist/parent/lib/parent.pm"&gt;parent&lt;/a&gt;&lt;/em&gt; faz as seguintes coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adiciona o pacote nomeado a &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/isa"&gt;@isa&lt;/a&gt;;&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;carrega o módulo com o mesmo nome do pacote nomeado usando &lt;em&gt;&lt;a href="https://perldoc.perl.org/functions/require"&gt;require&lt;/a&gt;&lt;/em&gt; (a menos que detecte que o pacote já foi carregado)&lt;/li&gt;
&lt;li&gt;Não chama a função de importação do pacote nomeado;&lt;/li&gt;
&lt;li&gt;A opção norequire diz para não fazer o require (então a classe já deve estar carregada). Isso significa que ele não precisa interceptar erros e decidir se eles devem ser suprimidos ou não.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👋🏻 Então pessoal, esses foram os pilares da Programação Orientada a Objetos no perl. Continuem de olho que logo mais farei publicações sobre o Moose e o Moo, suas diferenças e outras aplicações voltadas a essa linguagem de programação tão abrangente. Até a próxima.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>braziliandevs</category>
      <category>opensource</category>
      <category>poo</category>
    </item>
    <item>
      <title>Perl Orientado a Objeto Part I</title>
      <dc:creator>Victoria Ricarte Bispo Beserra</dc:creator>
      <pubDate>Thu, 21 Apr 2022 20:49:21 +0000</pubDate>
      <link>https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1</link>
      <guid>https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1</guid>
      <description>

&lt;p&gt;Como começar a programar em &lt;strong&gt;Perl&lt;/strong&gt; da maneira correta. &lt;del&gt;(Diferente de mim)&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-1bd1/"&gt;Perl Orientado a Objeto Part I&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-ii-2o54"&gt;Perl Orientado a Objeto Part II&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/perl-orientado-a-objeto-part-iii-4fe2"&gt;Perl Orientado a Objeto Part III&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/victoriabispo/moo-orientacao-de-objeto-minimalista-6el"&gt;Moo - Orientação de objeto minimalista&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  A linguagem de programação Perl
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“A linguagem pretende ser prática (fácil de usar, eficiente, completa) ao invés de bonita (pequena, elegante, mínima).”&lt;br&gt;&lt;br&gt;
— Kirrily Robert&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://perldoc.perl.org/perlintro"&gt;perlintro - a brief introduction and overview of Perl - Perldoc Browser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vou inaugurar meu &lt;a href="http://Dev.to"&gt;Dev.to&lt;/a&gt; falando mal de mim. Mas eu não seria eu mesma se não usasse um pouco a autodepreciação para, além de render umas boas risadas para mim mesma, alertar vocês de como  começar a estudar uma nova linguagem de programação indicando qual o começo certo, caso você decida embarcar no &lt;strong&gt;Perl&lt;/strong&gt; comigo.&lt;/p&gt;

&lt;p&gt;O Perl é uma linguagem de programação de uso geral, criada inicialmente pra manipulações de texto (e como ele cumpre muito bem esse papel viu), mas atualmente você pode criar até um universo com ela, se for bom. &lt;/p&gt;

&lt;p&gt;Também é uma linguagem antiga, foi criada em 1987. Por conta disso muitas pessoas me questionam “por que você escolheu Perl para trabalhar?” e o que mais costumo responder é: Eu não escolhi o Perl para trabalhar, foi ele quem me escolheu. Mas se fosse contar essa história ocuparia todo o post. Então vamos por a mão na massa.&lt;/p&gt;

&lt;p&gt;⚠️ Este post tem como objetivo definir orientação a objeto com Perl de maneira descontraída, por tanto ele leva em consideração que você, leitor, tenha conhecimento de lógica e linguagem e programação e saiba algumas definições de orientação a objeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Programação Orientada a Objeto
&lt;/h1&gt;

&lt;p&gt;A Programação Orientada a Objetos é um dos quatro paradigmas da programação, juntamente com: imperativa, funcional e lógica. Ela se baseia na composição (atributos) e e interação (métodos) de objetos.&lt;br&gt;
Perl é uma linguagem multiplataforma, e apenas a partir da sua versão 5 que ela passou a dar suporte para orientação a objeto. &lt;/p&gt;

&lt;p&gt;Para aplicar a orientação a objeto em Perl é muito simples. Veja a seguir:&lt;/p&gt;
&lt;h2&gt;
  
  
  Classes
&lt;/h2&gt;

&lt;p&gt;As classes são os pacotes dos arquivos que tem construtores que retornam objetos;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::&lt;/span&gt;&lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# General Class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Objetos
&lt;/h2&gt;

&lt;p&gt;Os objetos em Perl são estruturas de dados que agrupam atributos e métodos das nossas classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construtor
&lt;/h2&gt;

&lt;p&gt;A criação de um construtor no perl pode ser feita de maneira simples, usando uma de suas sub-rotinas para retornar a estrutura de dados abençoada (objeto) com todos os atributos de sua classe. O nome da sub-rotina não importa muito, mas por convenção e boas práticas de programação usamos o  new(). A seguir podemos ver um exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;model::&lt;/span&gt;&lt;span class="nv"&gt;Performances&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# General Class&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Constructor&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;# Attributes in classes&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;audience&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;type_play&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bless&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Métodos
&lt;/h2&gt;

&lt;p&gt;O método simplesmente é uma sub-rotina regular dentro de uma classe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;amount_for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# Method&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;audience&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$self&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;type_play&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👋🏻 Então pessoal, esses foram os conceitos mais básicos de orientação a objeto no perl. Continuem de olho que logo mais farei publicações sobre Polimorfismo, Herança e Encapsulamento e outras aplicações voltadas a essa linguagem de programação tão abrangente. Até a próxima.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>poo</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
