SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
Curs de Perl: Moose
                 (Orientació a Objectes)




                  Alex Muntada*
                  <alexm@alexm.org>


                     2012.03.10




*use Perl;
Orientació a objectes amb Moose
Índex

1 Sistema d’objectes de Perl 5                                                                      1
   1.1 Mòduls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      1
        1.1.1    Espai de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       1
        1.1.2    On es busquen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       1
        1.1.3    Quin aspecte tenen . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        2
        1.1.4    Com s’utilitzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     2
        1.1.5    Com es defineixen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        2
        1.1.6    Crida a les funcions del mòdul . . . . . . . . . . . . . . . . . . . . . . .        3
        1.1.7    Importació de símbols . . . . . . . . . . . . . . . . . . . . . . . . . . . .       3
        1.1.8    require vs. use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     3
        1.1.9    use vs. no . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    4
   1.2 Classes, mètodes i atributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . .         4
        1.2.1    Constructors, atributs, getters i setters . . . . . . . . . . . . . . . . . .       4
        1.2.2    Instàncies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    6
        1.2.3    Accessors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     6
   1.3 Herència . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      6

2 Moose                                                                                             9
   2.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       9
        2.1.1    Classes, mètodes i atributs . . . . . . . . . . . . . . . . . . . . . . . . .       9
        2.1.2    Hello, world! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    10
        2.1.3    Hello, world! accessible . . . . . . . . . . . . . . . . . . . . . . . . . . .     11
   2.2 Modificadors de mètodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           12
        2.2.1    before, after, around . . . . . . . . . . . . . . . . . . . . . . . . . . . .      12
        2.2.2    super, override . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    12
        2.2.3    inner, augment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     13
   2.3 Subtipus i coercions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       13
   2.4 Rols i trets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   14
        2.4.1    Per què? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   14
        2.4.2    Composició de rols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     15
   2.5 Delegació . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .      16
   2.6 Constructors i destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       17
   2.7 Protocol de meta-objectes i immutabilitat . . . . . . . . . . . . . . . . . . . .            17
   2.8 Extensions de Moose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        17

                                                                                                    iii
3 Pràctica                                                                                          19
     3.1 TMTOWTDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       19
     3.2 Solució senzilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   19
          3.2.1   Composició estàtica de rols . . . . . . . . . . . . . . . . . . . . . . . . .     19
          3.2.2   Composició dinàmica de rols . . . . . . . . . . . . . . . . . . . . . . . .       20




iv
Capítol 1

Sistema d’objectes de Perl 5

La base del sistema d’objectes són els mòduls (o paquets).



1.1 Mòduls

Com en qualsevol altre llenguatge permeten:


    • reutilització

    • separació

    • encapsulament

    • …



1.1.1 Espai de noms

use Foo ;
say $INC { ' Foo . pm '};
# / path / to / lib / Foo . pm


use Foo :: Bar ;
say $INC { ' Foo / Bar . pm '};
# / path / to / lib / Foo / Bar . pm




1.1.2 On es busquen

our @INC ;
use lib '/ path / to / lib ';


$ export PERL5LIB =/ path / to / lib
$ perl -V




                                                             1
Capítol 1 Sistema d’objectes de Perl 5                                 Alex Muntada Curs de Perl


1.1.3 Quin aspecte tenen
Abans es feien d’aquesta manera:
package HelloWorld ;


# our $VERSION = '1.00 ';


use vars qw ( $VERSION );
$VERSION = ' 1.00 ';


# ...


1;


A partir de Perl 5.14 ja es poden fer d’aquesta altra:
use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 1.00 {
      # ...
}


1;




1.1.4 Com s’utilitzen

use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld {
      sub hello {
          return " Hello , world !";
      }
}


# package main {
      say HelloWorld :: hello ();
# }


                                    Llistat 1.1: HelloWorld-hello.pl



1.1.5 Com es defineixen
Aquesta és la definició d’un mòdul més complex:
use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 1.00 {
      use Exporter qw ( import );


      our @EXPORT      = qw ( hello );
      our @EXPORT_OK = qw ( japh );



2
Alex Muntada Curs de Perl                                            Secció 1.1 Mòduls


     sub hello {
          return " Hello , world !";
     }


     sub japh {
          return " Just another Perl hacker ,";
     }
}


1;


                               Llistat 1.2: lib/1.00/HelloWorld.pm




1.1.6 Crida a les funcions del mòdul

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /1.00 ';
use HelloWorld 1.00;


say hello ();
say HelloWorld :: japh ();


                                       Llistat 1.3: hello1.pl




1.1.7 Importació de símbols

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /1.00 ';
use HelloWorld 1.00 qw ( japh );


# say hello (); => FAIL
say japh ();


                                       Llistat 1.4: hello2.pl




1.1.8 require vs. use
require…

     • s’avalua en temps d’execució,

     • un sol cop,

     • inclou el resultat al context actual.

use fa el mateix però…

     • s’avalua en temps de compilació,

                                                                                    3
Capítol 1 Sistema d’objectes de Perl 5                               Alex Muntada Curs de Perl


     • només admet barewords com a nom del mòdul,

     • sense eval no es poden utilitzar variables pel nom,

     • permet afegir una restricció de versió mínima del mòdul.


1.1.9 use vs. no

# use Module ;
BEGIN { require Module ; Module -> import (); }


# use Module ();
BEGIN { require Module ; }


# use Module LIST ;
BEGIN { require Module ; Module -> import ( LIST ); }


# no Module LIST ;
BEGIN { require Module ; Module -> unimport ( LIST ); }




1.2 Classes, mètodes i atributs
El mateix exemple d’abans…
use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 1.00 {
     use Exporter qw ( import );


     our @EXPORT      = qw ( hello );
     our @EXPORT_OK = qw ( japh );


     sub hello {
          return " Hello , world !";
     }


     sub japh {
          return " Just another Perl hacker ,";
     }
}


1;


                               Llistat 1.5: lib/1.00/HelloWorld.pm



1.2.1 Constructors, atributs, getters i setters
Els objectes són en realitat referències:
use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 1.01 {


4
Alex Muntada Curs de Perl                                      Secció 1.2 Classes, mètodes i atributs


     use Carp qw ( croak );


     sub new {
         my ( $class , % args ) = @_ ;


         my $obj = {
              hello => " Hello , world ! " ,
              japh       => " Just another Perl hacker , " ,
              % args ,
         };


         return bless $obj , $class ;
     }


     sub hello {
         my $self = shift ;


         return @_ ? $self -> set_hello ( @_ ) : $self - > get_hello ();
     }


     sub japh {
         my $self = shift ;


         return @_ ? $self -> set_japh ( @_ ) : $self - > get_japh ();
     }


     sub AUTOLOAD {
         my $self = shift ;
         my @args = @_ ;


         our $AUTOLOAD ;
         my ( $method ) = $AUTOLOAD =~ /::( w +) $ /;


         if       ( $method =~ /^ get_ ( w +)/ && exists $self - >{ $1 } ) {
              return $self - >{ $1 };
         }
         elsif ( $method =~ /^ set_ ( w +)/ && exists $self - >{ $1 } ) {
              my $new_value = $args [0];
              my $old_value = $self - >{ $1 };
              $self - >{ $1 }     = $new_value ;


              return $new_value ;
         }
         else {
              croak " Bad method name < $method >! ";
         }
     }


     sub DESTROY { }
}


1;



                                   Llistat 1.6: lib/1.01/HelloWorld.pm




                                                                                                   5
Capítol 1 Sistema d’objectes de Perl 5                            Alex Muntada Curs de Perl


1.2.2 Instàncies

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /1.01 ';
use HelloWorld 1.01;


my $h = HelloWorld -> new ();
say $h -> hello ();
say $h -> japh ();


my $j = HelloWorld -> new ( hello => ' JAPH ! ' );
say $j -> hello ();


                                         Llistat 1.7: hello3.pl



1.2.3 Accessors

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /1.01 ';
use HelloWorld 1.01;


my $j = HelloWorld -> new ();


# $j - > hello (); => OK


my $old_hello = $j -> get_hello ();
$j -> set_hello ( $j -> get_japh () );


say $old_hello ;
say $j -> get_hello ();
# say $j -> get_foobar (); => FAIL


                                         Llistat 1.8: hello4.pl




1.3 Herència

use 5.014;
use Modern :: Perl ' 2012 ';


package Baz {
    use parent qw ( Foo Bar );
}


package Baz {
    BEGIN {
         require Foo ;
         require Bar ;
         push our @ISA , qw ( Foo Bar );
    }


6
Alex Muntada Curs de Perl   Secció 1.3 Herència


}




                                             7
Orientació a objectes amb Moose
Capítol 2

Moose

2.1 Introducció
    • Construït damunt del sistema d’objectes de Perl 5.

    • Pren característiques d’altres llenguatges com Smalltalk, Common Lisp i Perl 6.

    • La forma més moderna de programar amb objectes en Perl modern.

    • Té sabors alternatius: Mouse, Moo, Mo.


2.1.1 Classes, mètodes i atributs

use 5.014;
use Modern :: Perl ' 2012 ';


package Pet {
    use Moose ;


    has ' name ' => (
         is    => 'ro ',
         isa => ' Str ',
    );
}


package Cat {
    use Moose ;


    extends ' Pet ';


    has ' diet ' => (
         is    => 'rw ',
         isa => ' Str ',
         );


    has ' birth_year ' => (
         is         => 'ro ',
         isa        => ' Int ',
               default     => sub { ( localtime )[5] + 1900 } ,
    );



                                                                                        9
Capítol 2 Moose                                                           Alex Muntada Curs de Perl


     sub meow {
          say " Meow !";
     }


     sub age {
          my $self = shift ;
          my $year = ( localtime )[5] + 1900;


          return $year - $self -> birth_year ;
     }
}


package main {
     my $fat = Cat -> new ( name => ' Fatty ' , age => 8 , diet = > ' Sea Treats ' );
     say $fat -> name , ' eats ', $fat -> diet ;


     $fat -> diet ( ' Low Sodium Kitty Lo Mein ' );
     say $fat -> name , ' eats ', $fat -> diet ;
}


                                            Llistat 2.1: cat.pl



2.1.2 Hello, world!

use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 2.00 {
     use Moose ;


     has ' hello ' => (
          is          => 'rw ',
          isa         => ' Str ',
          default => ' Hello , world ! ',
     );


     has ' japh ' => (
          is          => 'ro ',
          isa         => ' Str ',
          default => ' Just another Perl hacker , ' ,
     );
}


1;


                                    Llistat 2.2: lib/2.00/HelloWorld.pm

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /2.00 ';
use HelloWorld 2.00;


my $h = HelloWorld -> new ();


say $h -> hello ();


10
Alex Muntada Curs de Perl                                                 Secció 2.1 Introducció


$h -> hello ( ' hello ');
say $h -> hello ();


say $h -> japh ();
# $h - > japh (' japh '); => FAIL


my $j = HelloWorld -> new ( hello => ' JAPH ! ' );
say $j -> hello ();


                                           Llistat 2.3: hello5.pl



2.1.3 Hello, world! accessible

use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 2.01 {
     use Moose ;


     has ' hello ' => (
          is          => 'rw ',
          isa         => ' Str ',
          default => ' Hello , world ! ',
          reader      => ' get_hello ',
          writer      => ' set_hello ',
     );


     has ' japh ' => (
          is          => 'ro ',
          isa         => ' Str ',
          default => ' Just another Perl hacker , ' ,
          reader      => ' get_japh ' ,
          writer      => ' set_japh ' ,
     );
}


1;


                                    Llistat 2.4: lib/2.01/HelloWorld.pm

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /2.01 ';
use HelloWorld 2.01;


my $j = HelloWorld -> new ();


# $j - > hello (); => FAIL


my $old_hello = $j -> get_hello ();
$j -> set_hello ( $j -> get_japh () );


say $old_hello ;
say $j -> get_hello ();
# say $j -> get_foobar (); => FAIL


                                                                                             11
Capítol 2 Moose                                                  Alex Muntada Curs de Perl




                                        Llistat 2.5: hello6.pl




2.2 Modificadors de mètodes

2.2.1 before, after, around

package Cat {
     # ...


     before ' age ' => sub {
          my $self = shift ;


          die " cannot ask for " . $self -> name . " age "
                 unless $self -> doesnt_care ;
     };


     after ' age ' => sub {
          warn " too late to care n" ;
     };
}


package HelloWorld {
     # ...


     around ' hello ' => sub {
          my $orig = shift ;
          my $self = shift ;


          my $text = join q{ :: }, @_ ;


          return $self -> $orig ( $text );
     };
}




2.2.2 super, override

package CheaterKitty {
     # ...


     extends ' Cat ';


     override ' age ' => sub {
          my $self = shift ;


          my $age = super ();
          $age      /= 2
                 if $age > 1;


          return $age ;
     };
}




12
Alex Muntada Curs de Perl                                          Secció 2.3 Subtipus i coercions


2.2.3 inner, augment

use 5.014;
use Modern :: Perl ' 2012 ';


package Document {
    use Moose ;


    sub as_xml {
         my $self = shift ;


         my $xml = " < document >";
         $xml      .= inner ();
         $xml      .= " </ document >";


         return $xml ;
    }
}


package Report {
    use Moose ;


    extends ' Document ';


    augment ' as_xml ' => sub {
         my $self = shift ;


         return " < report > This is a report </ report > " ;
    };
}


package main {
    my $report = Report -> new ();
    say $report -> as_xml ();
}


                                          Llistat 2.6: report.pl




2.3 Subtipus i coercions

use 5.014;
use Modern :: Perl ' 2012 ';


package Foo {
    use Moose ;
    use Moose :: Util :: TypeConstraints ;
    use Moose :: Autobox ;


    subtype ' ArrayRefOfPositiveInts ' ,
         as ' ArrayRef [ Int ] ',
         message { " The array you provided has a negative number " } ,
         where {
                my @array      = @$_ ;
                my $positive = 1;



                                                                                               13
Capítol 2 Moose                                                   Alex Muntada Curs de Perl


                for my $next ( @array ) {
                      $positive &&= ( $next >= 0 ) or last ;
                }


                return $positive ;
          };


     coerce ' ArrayRefOfPositiveInts ' ,
          from ' Int ',
          via { [ $_ ] };


     has ' sizes '        => (
          is         => 'ro ',
          isa        => ' ArrayRefOfPositiveInts ',
          coerce => 1,
     );
}


package main {
     Foo -> new ( sizes => 42 );


     # Foo -> new ( sizes => [ 42 , -42 ] ); => FAIL
}


                                            Llistat 2.7: foo.pl




2.4 Rols i trets

2.4.1 Per què?

     • Objectes: què és el sistema.

          – Com són els objectes.

          – El model de dades és estable.

          – Habitualment és necessari documentar-lo.

     • Rols: què fa el sistema.

          – La lògica de negoci és canviable en el temps.

          – Facilita la creació de tests.

          – Eviten documentar els algorismes, el codi és la documentació.

          – Els trets a Moose són rols composats en temps d’execució.

     • Vistes: interacció amb els usuaris.

          – Diferents dispositius tenen entrades i sortides diferents.

          – Aspectes diversos: presentació, blog, llibre, etc.

          – Formats de sortida: HTML, text, ODT, PDF, etc.

14
Alex Muntada Curs de Perl                                               Secció 2.4 Rols i trets


2.4.2 Composició de rols

use 5.014;
use Modern :: Perl ' 2012 ';


package HelloWorld 2.02 {
     use Moose :: Role ;


     requires qw ( hello );


     has ' japh ' => (
          is        => 'ro ',
          isa       => ' Str ',
          default => ' Just another Perl hacker , ' ,
     );


     sub japh_hello {
          my $self = shift ;


          return $self -> japh . ' ' . $self -> hello . '! ';
     }
}


1;


                                  Llistat 2.8: lib/2.02/HelloWorld.pm


use 5.014;
use Modern :: Perl ' 2012 ';


package Pet 2.02 {
     use Moose ;


     has ' name ' => (
          is    => 'ro ',
          isa => ' Str ',
     );
}


1;


                                     Llistat 2.9: lib/2.02/Pet.pm


use 5.014;
use Modern :: Perl ' 2012 ';


package Cat 2.02 {
     use Moose ;


     extends ' Pet ';


     has ' diet ' => (
          is    => 'rw ',
          isa => ' Str ',
     );


     has ' birth_year ' => (


                                                                                            15
Capítol 2 Moose                                                     Alex Muntada Curs de Perl


          is         => 'ro ',
          isa        => ' Int ',
          default    => sub { ( localtime )[5] + 1900 } ,
     );


     has ' hello ' => (
          is        => 'rw ',
          isa       => ' Str ',
          lazy      => 1,
          default => sub { " hello " . shift -> name } ,
     );


     with ' HelloWorld ';


     sub meow {
          say " Meow !";
     }


     sub age {
          my $self = shift ;
          my $year = ( localtime )[5] + 1900;


          return $year - $self -> birth_year ;
     }
}


1;

                                    Llistat 2.10: lib/2.02/Cat.pm

use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /2.02 ';
use Cat 2.02;


my $fat = Cat -> new ( name => ' Kitty ', age = > 8 , diet = > ' Sea Treats ' );
say $fat -> japh_hello ()
     if $fat -> DOES ( ' HelloWorld ');

                                          Llistat 2.11: hello7.pl




2.5 Delegació
Importa mètodes d’un atribut sense crear una relació d’herència o composició de rols:
package Website {
     use Moose ;


     has ' uri '    => (
          is        => 'ro ',
          isa       => ' URI ',
          handles => [ qw ( host path )] ,
     );
}




16
Alex Muntada Curs de Perl                                    Secció 2.6 Constructors i destructors


2.6 Constructors i destructors
Compte! No definiu cap mètode new ni DESTROY. Disposeu d’aquests mecanismes:

    • BUILDARGS abans de crear l’objecte.

    • BUILD després de crear l’objecte.

    • DEMOLISH durant la destrucció de l’objecte.



2.7 Protocol de meta-objectes i immutabilitat
Tota aquest màgia és possible gràcies al MOP:
my $meta = User -> meta ();


for my $attribute ( $meta -> get_all_attributes ) {
    print $attribute -> name () , "n" ;


    if ( $attribute -> has_type_constraint ) {
         print "   type : " , $attribute -> type_constraint - > name , "  n " ;
    }
}


for my $method ( $meta -> get_all_methods ) {
    print $method -> name , "n";
}


Per optimitzar l’execució i per evitar que una classe canviï:
__PACKAGE__ -> meta -> make_immutable ;




2.8 Extensions de Moose
Algunes de les extensions recomanades a Moose::Manual::MooseX:

    • Moose::Autobox

    • MooseX::StrictConstructor

    • MooseX::Params::Validate

    • MooseX::Getopt

    • MooseX::Singleton

Altres extensions interessants:

    • MooseX::Declare

    • MooseX::ClassAttribute

    • MooseX::Daemonize

    • MooseX::Role::Parameterized

                                                                                               17
Capítol 2 Moose                         Alex Muntada Curs de Perl


     • MooseX::SemiAffordanceAccessor

     • MooseX::NonMoose




18
Capítol 3

Pràctica

A partir de la classe HelloWorld, dissenyeu un sistema de presentació de diapositives que
pugui generar sortida en diferents formats.

   • Heu d’utilitzar Moose.

   • Separeu el què és el sistema del què fa amb Moose::Role.

   • Utilitzeu els patrons Model-Vista-Controlador (MVC) o Data-Context-Interaction (DCI).

   • El sistema ha de generar com a mínim una versió en HTML.

   • Opcionalment pot generar versions en ODF, PDF, etc.



3.1 TMTOWTDI
Debat sobre les propostes:

   • Punts forts i punts febles.

   • Alternatives.



3.2 Solució senzilla
Una classe Doc que composa el rol HTML.


3.2.1 Composició estàtica de rols

use 5.014;
use Modern :: Perl ' 2012 ';


package HTML 3.00 {
    use Moose :: Role ;


    requires qw ( title body author );


    sub print_html {
         my $self = shift ;


                                                                                      19
Capítol 3 Pràctica                                                       Alex Muntada Curs de Perl



          say " < title >" . $self -> title . " </ title >" ;
          say " < head meta =" author " content =" " . $self - > author . " "/ > " ;
          say " <body >"     . $self -> body   . " </ body >" ;
     }
}


1;


                                     Llistat 3.1: lib/3.00/HTML.pm


use 5.014;
use Modern :: Perl ' 2012 ';


package Doc 3.00 {
     use Moose ;


     has ' title ',        is => 'ro ', isa => ' Str ';
     has ' body ',         is => 'ro ', isa => ' Str ';
     has ' tag_list ', is => 'ro ', isa = > ' ArrayRef [ Str ] ';
     has ' author ',       is => 'ro ', isa = > ' Str ';


     with ' HTML ';
}


1;


                                      Llistat 3.2: lib/3.00/Doc.pm


use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /3.00 ';
use Doc 3.00;


my $r = Doc -> new ( title => 'T ', body = > 'B ', author = > 'A ' );
$r -> print_html
     if $r -> DOES ( ' HTML ');


                                          Llistat 3.3: doc1.pl




3.2.2 Composició dinàmica de rols

use 5.014;
use Modern :: Perl ' 2012 ';


package HTML 3.01 {
     use Moose :: Role ;


     requires qw ( title body author );


     sub print_html {
          my $self = shift ;


          say " < title >" . $self -> title . " </ title >" ;


20
Alex Muntada Curs de Perl                                                 Secció 3.2 Solució senzilla


          say " < head meta =" author " content =" " . $self - > author . " "/ > " ;
          say " <body >"     . $self -> body   . " </ body >" ;
     }
}


1;


                                     Llistat 3.4: lib/3.01/HTML.pm


use 5.014;
use Modern :: Perl ' 2012 ';


package Doc 3.01 {
     use Moose ;


     has ' title ',        is => 'ro ', isa => ' Str ';
     has ' body ',         is => 'ro ', isa => ' Str ';
     has ' tag_list ', is => 'ro ', isa = > ' ArrayRef [ Str ] ';
     has ' author ',       is => 'ro ', isa = > ' Str ';
}


1;


                                      Llistat 3.5: lib/3.01/Doc.pm


use 5.014;
use Modern :: Perl ' 2012 ';


use lib ' lib /3.01 ';
use Doc 3.01;


use Moose :: Util qw ( apply_all_roles );


my $r = Doc -> new ( title => 'T ', body = > 'B ', author = > 'A ' );
apply_all_roles ( $r , ' HTML ' );
$r -> print_html if $r -> DOES ( ' HTML ' );


                                          Llistat 3.6: doc2.pl




                                                                                                  21

Weitere ähnliche Inhalte

Andere mochten auch

How to Negotiate, Part 2
How to Negotiate, Part 2How to Negotiate, Part 2
How to Negotiate, Part 2tcg: agency
 
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006Ana Cascao
 
You belong here and you can be successful
You belong here and you can be successfulYou belong here and you can be successful
You belong here and you can be successfulcolwilliamson
 
Engaging Students Through Technology
Engaging Students Through TechnologyEngaging Students Through Technology
Engaging Students Through TechnologyScott Moore
 
Renkomäen koulun veso 30.5.2011
Renkomäen koulun veso 30.5.2011Renkomäen koulun veso 30.5.2011
Renkomäen koulun veso 30.5.2011Jukka Manninen
 
7 Most Beautiful Oases
7 Most Beautiful Oases7 Most Beautiful Oases
7 Most Beautiful Oasessutrisno2629
 
Video Upload Slide Share
Video Upload Slide ShareVideo Upload Slide Share
Video Upload Slide ShareTeachStreet
 
From Idea to Exit, the story of our startup
From Idea to Exit, the story of our startupFrom Idea to Exit, the story of our startup
From Idea to Exit, the story of our startupNatalie Downe
 
Open Only If You Have Time For God
Open Only If You Have Time For GodOpen Only If You Have Time For God
Open Only If You Have Time For Godsutrisno2629
 
The Changing Landscape of Public Relations
The Changing Landscape of Public RelationsThe Changing Landscape of Public Relations
The Changing Landscape of Public RelationsGlen Turpin
 

Andere mochten auch (17)

Globalvillage1
Globalvillage1Globalvillage1
Globalvillage1
 
Dades i operadors
Dades i operadorsDades i operadors
Dades i operadors
 
How to Negotiate, Part 2
How to Negotiate, Part 2How to Negotiate, Part 2
How to Negotiate, Part 2
 
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006
Cascao Addis Ababa Knowledge For Water Equity Nile Basin 2006
 
Bingo Numbers
Bingo NumbersBingo Numbers
Bingo Numbers
 
02 Web Search
02 Web Search02 Web Search
02 Web Search
 
You belong here and you can be successful
You belong here and you can be successfulYou belong here and you can be successful
You belong here and you can be successful
 
Engaging Students Through Technology
Engaging Students Through TechnologyEngaging Students Through Technology
Engaging Students Through Technology
 
Renkomäen koulun veso 30.5.2011
Renkomäen koulun veso 30.5.2011Renkomäen koulun veso 30.5.2011
Renkomäen koulun veso 30.5.2011
 
My personal brand
My personal brandMy personal brand
My personal brand
 
7 Most Beautiful Oases
7 Most Beautiful Oases7 Most Beautiful Oases
7 Most Beautiful Oases
 
Video Upload Slide Share
Video Upload Slide ShareVideo Upload Slide Share
Video Upload Slide Share
 
From Idea to Exit, the story of our startup
From Idea to Exit, the story of our startupFrom Idea to Exit, the story of our startup
From Idea to Exit, the story of our startup
 
Open Only If You Have Time For God
Open Only If You Have Time For GodOpen Only If You Have Time For God
Open Only If You Have Time For God
 
The Changing Landscape of Public Relations
The Changing Landscape of Public RelationsThe Changing Landscape of Public Relations
The Changing Landscape of Public Relations
 
Friendship
FriendshipFriendship
Friendship
 
Coffee1
Coffee1Coffee1
Coffee1
 

Ähnlich wie Orientació a objectes amb Moose

Curs Ofimàtica 2004-2005. Bloc OO Presentacions
Curs Ofimàtica 2004-2005. Bloc OO PresentacionsCurs Ofimàtica 2004-2005. Bloc OO Presentacions
Curs Ofimàtica 2004-2005. Bloc OO PresentacionsAlex Araujo
 
Guia per l'alumne TRM ETSE URV
Guia per l'alumne TRM ETSE URVGuia per l'alumne TRM ETSE URV
Guia per l'alumne TRM ETSE URVadriamp
 
Algorisme De Detecció De Cossos En Moviment
Algorisme De Detecció De Cossos En MovimentAlgorisme De Detecció De Cossos En Moviment
Algorisme De Detecció De Cossos En Movimentadriamp
 
Tecnologia comunicacionsdigitals
Tecnologia comunicacionsdigitalsTecnologia comunicacionsdigitals
Tecnologia comunicacionsdigitalsDGS
 
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...Francesc Perez
 
Openkm tutorial al sistema operatiu Debian
Openkm tutorial al sistema operatiu DebianOpenkm tutorial al sistema operatiu Debian
Openkm tutorial al sistema operatiu DebianPAUNIKITAPERERAROCAS
 
Curs Ofimàtica 2004-2005. Bloc MS Excel
Curs Ofimàtica 2004-2005. Bloc MS ExcelCurs Ofimàtica 2004-2005. Bloc MS Excel
Curs Ofimàtica 2004-2005. Bloc MS ExcelAlex Araujo
 
Manual d'instalació i guia del VirtualBox
Manual d'instalació i guia del VirtualBoxManual d'instalació i guia del VirtualBox
Manual d'instalació i guia del VirtualBoxaleixaranda12
 
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdf
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdfTreball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdf
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdfaNDREUETgARCIA
 
M3 actividad manual virtual box trabajo dos.pdf
M3 actividad manual virtual box  trabajo dos.pdfM3 actividad manual virtual box  trabajo dos.pdf
M3 actividad manual virtual box trabajo dos.pdfethanmunoz6
 
JavaScript per a desenvolupadors de C#
JavaScript per a desenvolupadors de C#JavaScript per a desenvolupadors de C#
JavaScript per a desenvolupadors de C#Edin Kapic
 
Activitat Ubuntu
Activitat UbuntuActivitat Ubuntu
Activitat Ubuntuavg.aux
 

Ähnlich wie Orientació a objectes amb Moose (20)

Curs Ofimàtica 2004-2005. Bloc OO Presentacions
Curs Ofimàtica 2004-2005. Bloc OO PresentacionsCurs Ofimàtica 2004-2005. Bloc OO Presentacions
Curs Ofimàtica 2004-2005. Bloc OO Presentacions
 
Openldap
OpenldapOpenldap
Openldap
 
Manual de Kolour paint en català
Manual de Kolour paint en catalàManual de Kolour paint en català
Manual de Kolour paint en català
 
Preguntesbloc
PreguntesblocPreguntesbloc
Preguntesbloc
 
Guia per l'alumne TRM ETSE URV
Guia per l'alumne TRM ETSE URVGuia per l'alumne TRM ETSE URV
Guia per l'alumne TRM ETSE URV
 
Algorisme De Detecció De Cossos En Moviment
Algorisme De Detecció De Cossos En MovimentAlgorisme De Detecció De Cossos En Moviment
Algorisme De Detecció De Cossos En Moviment
 
Tecnologia comunicacionsdigitals
Tecnologia comunicacionsdigitalsTecnologia comunicacionsdigitals
Tecnologia comunicacionsdigitals
 
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...
Proyectos: Sistema de monitorización Nagios aplicado al centro de Estudios St...
 
CliniClue Xplore, manual d'usuari
CliniClue Xplore, manual d'usuariCliniClue Xplore, manual d'usuari
CliniClue Xplore, manual d'usuari
 
M270
M270M270
M270
 
Openkm tutorial al sistema operatiu Debian
Openkm tutorial al sistema operatiu DebianOpenkm tutorial al sistema operatiu Debian
Openkm tutorial al sistema operatiu Debian
 
Manual usuari SNOB CAT
Manual usuari SNOB CATManual usuari SNOB CAT
Manual usuari SNOB CAT
 
Curs Ofimàtica 2004-2005. Bloc MS Excel
Curs Ofimàtica 2004-2005. Bloc MS ExcelCurs Ofimàtica 2004-2005. Bloc MS Excel
Curs Ofimàtica 2004-2005. Bloc MS Excel
 
Solucionario mates 1 batx
Solucionario mates 1 batxSolucionario mates 1 batx
Solucionario mates 1 batx
 
Manual d'instalació i guia del VirtualBox
Manual d'instalació i guia del VirtualBoxManual d'instalació i guia del VirtualBox
Manual d'instalació i guia del VirtualBox
 
Guia usos
Guia usosGuia usos
Guia usos
 
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdf
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdfTreball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdf
Treball_Final_de_Grau_a_l_EPS_de_la_UIB - 14.09.22.pdf
 
M3 actividad manual virtual box trabajo dos.pdf
M3 actividad manual virtual box  trabajo dos.pdfM3 actividad manual virtual box  trabajo dos.pdf
M3 actividad manual virtual box trabajo dos.pdf
 
JavaScript per a desenvolupadors de C#
JavaScript per a desenvolupadors de C#JavaScript per a desenvolupadors de C#
JavaScript per a desenvolupadors de C#
 
Activitat Ubuntu
Activitat UbuntuActivitat Ubuntu
Activitat Ubuntu
 

Mehr von Alex Muntada Duran

Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)
Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)
Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)Alex Muntada Duran
 
Desenvolupament al projecte Debian
Desenvolupament al projecte DebianDesenvolupament al projecte Debian
Desenvolupament al projecte DebianAlex Muntada Duran
 
Programació orientada a objectes en Perl
Programació orientada a objectes en PerlProgramació orientada a objectes en Perl
Programació orientada a objectes en PerlAlex Muntada Duran
 
Cloenda del Curs d'introducció a Perl 2011
Cloenda del Curs d'introducció a Perl 2011Cloenda del Curs d'introducció a Perl 2011
Cloenda del Curs d'introducció a Perl 2011Alex Muntada Duran
 
Benvinguda al Curs d'introducció a Perl 2011
Benvinguda al Curs d'introducció a Perl 2011Benvinguda al Curs d'introducció a Perl 2011
Benvinguda al Curs d'introducció a Perl 2011Alex Muntada Duran
 

Mehr von Alex Muntada Duran (10)

Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)
Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)
Equips cibernètics, realitat o ficció? (Jornada TIC UPC 2017)
 
Desenvolupament al projecte Debian
Desenvolupament al projecte DebianDesenvolupament al projecte Debian
Desenvolupament al projecte Debian
 
REST in theory
REST in theoryREST in theory
REST in theory
 
Comiat del curs de Perl
Comiat del curs de PerlComiat del curs de Perl
Comiat del curs de Perl
 
Benvinguda al curs de Perl
Benvinguda al curs de PerlBenvinguda al curs de Perl
Benvinguda al curs de Perl
 
Programació orientada a objectes en Perl
Programació orientada a objectes en PerlProgramació orientada a objectes en Perl
Programació orientada a objectes en Perl
 
Cloenda del Curs d'introducció a Perl 2011
Cloenda del Curs d'introducció a Perl 2011Cloenda del Curs d'introducció a Perl 2011
Cloenda del Curs d'introducció a Perl 2011
 
Benvinguda al Curs d'introducció a Perl 2011
Benvinguda al Curs d'introducció a Perl 2011Benvinguda al Curs d'introducció a Perl 2011
Benvinguda al Curs d'introducció a Perl 2011
 
Modern Perl Toolchain
Modern Perl ToolchainModern Perl Toolchain
Modern Perl Toolchain
 
dh-make-perl
dh-make-perldh-make-perl
dh-make-perl
 

Orientació a objectes amb Moose

  • 1. Curs de Perl: Moose (Orientació a Objectes) Alex Muntada* <alexm@alexm.org> 2012.03.10 *use Perl;
  • 3. Índex 1 Sistema d’objectes de Perl 5 1 1.1 Mòduls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.1 Espai de noms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.2 On es busquen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1.3 Quin aspecte tenen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.4 Com s’utilitzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.5 Com es defineixen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.1.6 Crida a les funcions del mòdul . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.7 Importació de símbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.8 require vs. use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.9 use vs. no . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Classes, mètodes i atributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.1 Constructors, atributs, getters i setters . . . . . . . . . . . . . . . . . . 4 1.2.2 Instàncies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2.3 Accessors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3 Herència . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2 Moose 9 2.1 Introducció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.1 Classes, mètodes i atributs . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.2 Hello, world! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.3 Hello, world! accessible . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Modificadors de mètodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.1 before, after, around . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.2 super, override . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.3 inner, augment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3 Subtipus i coercions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4 Rols i trets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.1 Per què? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.2 Composició de rols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.5 Delegació . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.6 Constructors i destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.7 Protocol de meta-objectes i immutabilitat . . . . . . . . . . . . . . . . . . . . 17 2.8 Extensions de Moose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 iii
  • 4. 3 Pràctica 19 3.1 TMTOWTDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2 Solució senzilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2.1 Composició estàtica de rols . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2.2 Composició dinàmica de rols . . . . . . . . . . . . . . . . . . . . . . . . 20 iv
  • 5. Capítol 1 Sistema d’objectes de Perl 5 La base del sistema d’objectes són els mòduls (o paquets). 1.1 Mòduls Com en qualsevol altre llenguatge permeten: • reutilització • separació • encapsulament • … 1.1.1 Espai de noms use Foo ; say $INC { ' Foo . pm '}; # / path / to / lib / Foo . pm use Foo :: Bar ; say $INC { ' Foo / Bar . pm '}; # / path / to / lib / Foo / Bar . pm 1.1.2 On es busquen our @INC ; use lib '/ path / to / lib '; $ export PERL5LIB =/ path / to / lib $ perl -V 1
  • 6. Capítol 1 Sistema d’objectes de Perl 5 Alex Muntada Curs de Perl 1.1.3 Quin aspecte tenen Abans es feien d’aquesta manera: package HelloWorld ; # our $VERSION = '1.00 '; use vars qw ( $VERSION ); $VERSION = ' 1.00 '; # ... 1; A partir de Perl 5.14 ja es poden fer d’aquesta altra: use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 1.00 { # ... } 1; 1.1.4 Com s’utilitzen use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld { sub hello { return " Hello , world !"; } } # package main { say HelloWorld :: hello (); # } Llistat 1.1: HelloWorld-hello.pl 1.1.5 Com es defineixen Aquesta és la definició d’un mòdul més complex: use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 1.00 { use Exporter qw ( import ); our @EXPORT = qw ( hello ); our @EXPORT_OK = qw ( japh ); 2
  • 7. Alex Muntada Curs de Perl Secció 1.1 Mòduls sub hello { return " Hello , world !"; } sub japh { return " Just another Perl hacker ,"; } } 1; Llistat 1.2: lib/1.00/HelloWorld.pm 1.1.6 Crida a les funcions del mòdul use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /1.00 '; use HelloWorld 1.00; say hello (); say HelloWorld :: japh (); Llistat 1.3: hello1.pl 1.1.7 Importació de símbols use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /1.00 '; use HelloWorld 1.00 qw ( japh ); # say hello (); => FAIL say japh (); Llistat 1.4: hello2.pl 1.1.8 require vs. use require… • s’avalua en temps d’execució, • un sol cop, • inclou el resultat al context actual. use fa el mateix però… • s’avalua en temps de compilació, 3
  • 8. Capítol 1 Sistema d’objectes de Perl 5 Alex Muntada Curs de Perl • només admet barewords com a nom del mòdul, • sense eval no es poden utilitzar variables pel nom, • permet afegir una restricció de versió mínima del mòdul. 1.1.9 use vs. no # use Module ; BEGIN { require Module ; Module -> import (); } # use Module (); BEGIN { require Module ; } # use Module LIST ; BEGIN { require Module ; Module -> import ( LIST ); } # no Module LIST ; BEGIN { require Module ; Module -> unimport ( LIST ); } 1.2 Classes, mètodes i atributs El mateix exemple d’abans… use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 1.00 { use Exporter qw ( import ); our @EXPORT = qw ( hello ); our @EXPORT_OK = qw ( japh ); sub hello { return " Hello , world !"; } sub japh { return " Just another Perl hacker ,"; } } 1; Llistat 1.5: lib/1.00/HelloWorld.pm 1.2.1 Constructors, atributs, getters i setters Els objectes són en realitat referències: use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 1.01 { 4
  • 9. Alex Muntada Curs de Perl Secció 1.2 Classes, mètodes i atributs use Carp qw ( croak ); sub new { my ( $class , % args ) = @_ ; my $obj = { hello => " Hello , world ! " , japh => " Just another Perl hacker , " , % args , }; return bless $obj , $class ; } sub hello { my $self = shift ; return @_ ? $self -> set_hello ( @_ ) : $self - > get_hello (); } sub japh { my $self = shift ; return @_ ? $self -> set_japh ( @_ ) : $self - > get_japh (); } sub AUTOLOAD { my $self = shift ; my @args = @_ ; our $AUTOLOAD ; my ( $method ) = $AUTOLOAD =~ /::( w +) $ /; if ( $method =~ /^ get_ ( w +)/ && exists $self - >{ $1 } ) { return $self - >{ $1 }; } elsif ( $method =~ /^ set_ ( w +)/ && exists $self - >{ $1 } ) { my $new_value = $args [0]; my $old_value = $self - >{ $1 }; $self - >{ $1 } = $new_value ; return $new_value ; } else { croak " Bad method name < $method >! "; } } sub DESTROY { } } 1; Llistat 1.6: lib/1.01/HelloWorld.pm 5
  • 10. Capítol 1 Sistema d’objectes de Perl 5 Alex Muntada Curs de Perl 1.2.2 Instàncies use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /1.01 '; use HelloWorld 1.01; my $h = HelloWorld -> new (); say $h -> hello (); say $h -> japh (); my $j = HelloWorld -> new ( hello => ' JAPH ! ' ); say $j -> hello (); Llistat 1.7: hello3.pl 1.2.3 Accessors use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /1.01 '; use HelloWorld 1.01; my $j = HelloWorld -> new (); # $j - > hello (); => OK my $old_hello = $j -> get_hello (); $j -> set_hello ( $j -> get_japh () ); say $old_hello ; say $j -> get_hello (); # say $j -> get_foobar (); => FAIL Llistat 1.8: hello4.pl 1.3 Herència use 5.014; use Modern :: Perl ' 2012 '; package Baz { use parent qw ( Foo Bar ); } package Baz { BEGIN { require Foo ; require Bar ; push our @ISA , qw ( Foo Bar ); } 6
  • 11. Alex Muntada Curs de Perl Secció 1.3 Herència } 7
  • 13. Capítol 2 Moose 2.1 Introducció • Construït damunt del sistema d’objectes de Perl 5. • Pren característiques d’altres llenguatges com Smalltalk, Common Lisp i Perl 6. • La forma més moderna de programar amb objectes en Perl modern. • Té sabors alternatius: Mouse, Moo, Mo. 2.1.1 Classes, mètodes i atributs use 5.014; use Modern :: Perl ' 2012 '; package Pet { use Moose ; has ' name ' => ( is => 'ro ', isa => ' Str ', ); } package Cat { use Moose ; extends ' Pet '; has ' diet ' => ( is => 'rw ', isa => ' Str ', ); has ' birth_year ' => ( is => 'ro ', isa => ' Int ', default => sub { ( localtime )[5] + 1900 } , ); 9
  • 14. Capítol 2 Moose Alex Muntada Curs de Perl sub meow { say " Meow !"; } sub age { my $self = shift ; my $year = ( localtime )[5] + 1900; return $year - $self -> birth_year ; } } package main { my $fat = Cat -> new ( name => ' Fatty ' , age => 8 , diet = > ' Sea Treats ' ); say $fat -> name , ' eats ', $fat -> diet ; $fat -> diet ( ' Low Sodium Kitty Lo Mein ' ); say $fat -> name , ' eats ', $fat -> diet ; } Llistat 2.1: cat.pl 2.1.2 Hello, world! use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 2.00 { use Moose ; has ' hello ' => ( is => 'rw ', isa => ' Str ', default => ' Hello , world ! ', ); has ' japh ' => ( is => 'ro ', isa => ' Str ', default => ' Just another Perl hacker , ' , ); } 1; Llistat 2.2: lib/2.00/HelloWorld.pm use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /2.00 '; use HelloWorld 2.00; my $h = HelloWorld -> new (); say $h -> hello (); 10
  • 15. Alex Muntada Curs de Perl Secció 2.1 Introducció $h -> hello ( ' hello '); say $h -> hello (); say $h -> japh (); # $h - > japh (' japh '); => FAIL my $j = HelloWorld -> new ( hello => ' JAPH ! ' ); say $j -> hello (); Llistat 2.3: hello5.pl 2.1.3 Hello, world! accessible use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 2.01 { use Moose ; has ' hello ' => ( is => 'rw ', isa => ' Str ', default => ' Hello , world ! ', reader => ' get_hello ', writer => ' set_hello ', ); has ' japh ' => ( is => 'ro ', isa => ' Str ', default => ' Just another Perl hacker , ' , reader => ' get_japh ' , writer => ' set_japh ' , ); } 1; Llistat 2.4: lib/2.01/HelloWorld.pm use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /2.01 '; use HelloWorld 2.01; my $j = HelloWorld -> new (); # $j - > hello (); => FAIL my $old_hello = $j -> get_hello (); $j -> set_hello ( $j -> get_japh () ); say $old_hello ; say $j -> get_hello (); # say $j -> get_foobar (); => FAIL 11
  • 16. Capítol 2 Moose Alex Muntada Curs de Perl Llistat 2.5: hello6.pl 2.2 Modificadors de mètodes 2.2.1 before, after, around package Cat { # ... before ' age ' => sub { my $self = shift ; die " cannot ask for " . $self -> name . " age " unless $self -> doesnt_care ; }; after ' age ' => sub { warn " too late to care n" ; }; } package HelloWorld { # ... around ' hello ' => sub { my $orig = shift ; my $self = shift ; my $text = join q{ :: }, @_ ; return $self -> $orig ( $text ); }; } 2.2.2 super, override package CheaterKitty { # ... extends ' Cat '; override ' age ' => sub { my $self = shift ; my $age = super (); $age /= 2 if $age > 1; return $age ; }; } 12
  • 17. Alex Muntada Curs de Perl Secció 2.3 Subtipus i coercions 2.2.3 inner, augment use 5.014; use Modern :: Perl ' 2012 '; package Document { use Moose ; sub as_xml { my $self = shift ; my $xml = " < document >"; $xml .= inner (); $xml .= " </ document >"; return $xml ; } } package Report { use Moose ; extends ' Document '; augment ' as_xml ' => sub { my $self = shift ; return " < report > This is a report </ report > " ; }; } package main { my $report = Report -> new (); say $report -> as_xml (); } Llistat 2.6: report.pl 2.3 Subtipus i coercions use 5.014; use Modern :: Perl ' 2012 '; package Foo { use Moose ; use Moose :: Util :: TypeConstraints ; use Moose :: Autobox ; subtype ' ArrayRefOfPositiveInts ' , as ' ArrayRef [ Int ] ', message { " The array you provided has a negative number " } , where { my @array = @$_ ; my $positive = 1; 13
  • 18. Capítol 2 Moose Alex Muntada Curs de Perl for my $next ( @array ) { $positive &&= ( $next >= 0 ) or last ; } return $positive ; }; coerce ' ArrayRefOfPositiveInts ' , from ' Int ', via { [ $_ ] }; has ' sizes ' => ( is => 'ro ', isa => ' ArrayRefOfPositiveInts ', coerce => 1, ); } package main { Foo -> new ( sizes => 42 ); # Foo -> new ( sizes => [ 42 , -42 ] ); => FAIL } Llistat 2.7: foo.pl 2.4 Rols i trets 2.4.1 Per què? • Objectes: què és el sistema. – Com són els objectes. – El model de dades és estable. – Habitualment és necessari documentar-lo. • Rols: què fa el sistema. – La lògica de negoci és canviable en el temps. – Facilita la creació de tests. – Eviten documentar els algorismes, el codi és la documentació. – Els trets a Moose són rols composats en temps d’execució. • Vistes: interacció amb els usuaris. – Diferents dispositius tenen entrades i sortides diferents. – Aspectes diversos: presentació, blog, llibre, etc. – Formats de sortida: HTML, text, ODT, PDF, etc. 14
  • 19. Alex Muntada Curs de Perl Secció 2.4 Rols i trets 2.4.2 Composició de rols use 5.014; use Modern :: Perl ' 2012 '; package HelloWorld 2.02 { use Moose :: Role ; requires qw ( hello ); has ' japh ' => ( is => 'ro ', isa => ' Str ', default => ' Just another Perl hacker , ' , ); sub japh_hello { my $self = shift ; return $self -> japh . ' ' . $self -> hello . '! '; } } 1; Llistat 2.8: lib/2.02/HelloWorld.pm use 5.014; use Modern :: Perl ' 2012 '; package Pet 2.02 { use Moose ; has ' name ' => ( is => 'ro ', isa => ' Str ', ); } 1; Llistat 2.9: lib/2.02/Pet.pm use 5.014; use Modern :: Perl ' 2012 '; package Cat 2.02 { use Moose ; extends ' Pet '; has ' diet ' => ( is => 'rw ', isa => ' Str ', ); has ' birth_year ' => ( 15
  • 20. Capítol 2 Moose Alex Muntada Curs de Perl is => 'ro ', isa => ' Int ', default => sub { ( localtime )[5] + 1900 } , ); has ' hello ' => ( is => 'rw ', isa => ' Str ', lazy => 1, default => sub { " hello " . shift -> name } , ); with ' HelloWorld '; sub meow { say " Meow !"; } sub age { my $self = shift ; my $year = ( localtime )[5] + 1900; return $year - $self -> birth_year ; } } 1; Llistat 2.10: lib/2.02/Cat.pm use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /2.02 '; use Cat 2.02; my $fat = Cat -> new ( name => ' Kitty ', age = > 8 , diet = > ' Sea Treats ' ); say $fat -> japh_hello () if $fat -> DOES ( ' HelloWorld '); Llistat 2.11: hello7.pl 2.5 Delegació Importa mètodes d’un atribut sense crear una relació d’herència o composició de rols: package Website { use Moose ; has ' uri ' => ( is => 'ro ', isa => ' URI ', handles => [ qw ( host path )] , ); } 16
  • 21. Alex Muntada Curs de Perl Secció 2.6 Constructors i destructors 2.6 Constructors i destructors Compte! No definiu cap mètode new ni DESTROY. Disposeu d’aquests mecanismes: • BUILDARGS abans de crear l’objecte. • BUILD després de crear l’objecte. • DEMOLISH durant la destrucció de l’objecte. 2.7 Protocol de meta-objectes i immutabilitat Tota aquest màgia és possible gràcies al MOP: my $meta = User -> meta (); for my $attribute ( $meta -> get_all_attributes ) { print $attribute -> name () , "n" ; if ( $attribute -> has_type_constraint ) { print " type : " , $attribute -> type_constraint - > name , " n " ; } } for my $method ( $meta -> get_all_methods ) { print $method -> name , "n"; } Per optimitzar l’execució i per evitar que una classe canviï: __PACKAGE__ -> meta -> make_immutable ; 2.8 Extensions de Moose Algunes de les extensions recomanades a Moose::Manual::MooseX: • Moose::Autobox • MooseX::StrictConstructor • MooseX::Params::Validate • MooseX::Getopt • MooseX::Singleton Altres extensions interessants: • MooseX::Declare • MooseX::ClassAttribute • MooseX::Daemonize • MooseX::Role::Parameterized 17
  • 22. Capítol 2 Moose Alex Muntada Curs de Perl • MooseX::SemiAffordanceAccessor • MooseX::NonMoose 18
  • 23. Capítol 3 Pràctica A partir de la classe HelloWorld, dissenyeu un sistema de presentació de diapositives que pugui generar sortida en diferents formats. • Heu d’utilitzar Moose. • Separeu el què és el sistema del què fa amb Moose::Role. • Utilitzeu els patrons Model-Vista-Controlador (MVC) o Data-Context-Interaction (DCI). • El sistema ha de generar com a mínim una versió en HTML. • Opcionalment pot generar versions en ODF, PDF, etc. 3.1 TMTOWTDI Debat sobre les propostes: • Punts forts i punts febles. • Alternatives. 3.2 Solució senzilla Una classe Doc que composa el rol HTML. 3.2.1 Composició estàtica de rols use 5.014; use Modern :: Perl ' 2012 '; package HTML 3.00 { use Moose :: Role ; requires qw ( title body author ); sub print_html { my $self = shift ; 19
  • 24. Capítol 3 Pràctica Alex Muntada Curs de Perl say " < title >" . $self -> title . " </ title >" ; say " < head meta =" author " content =" " . $self - > author . " "/ > " ; say " <body >" . $self -> body . " </ body >" ; } } 1; Llistat 3.1: lib/3.00/HTML.pm use 5.014; use Modern :: Perl ' 2012 '; package Doc 3.00 { use Moose ; has ' title ', is => 'ro ', isa => ' Str '; has ' body ', is => 'ro ', isa => ' Str '; has ' tag_list ', is => 'ro ', isa = > ' ArrayRef [ Str ] '; has ' author ', is => 'ro ', isa = > ' Str '; with ' HTML '; } 1; Llistat 3.2: lib/3.00/Doc.pm use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /3.00 '; use Doc 3.00; my $r = Doc -> new ( title => 'T ', body = > 'B ', author = > 'A ' ); $r -> print_html if $r -> DOES ( ' HTML '); Llistat 3.3: doc1.pl 3.2.2 Composició dinàmica de rols use 5.014; use Modern :: Perl ' 2012 '; package HTML 3.01 { use Moose :: Role ; requires qw ( title body author ); sub print_html { my $self = shift ; say " < title >" . $self -> title . " </ title >" ; 20
  • 25. Alex Muntada Curs de Perl Secció 3.2 Solució senzilla say " < head meta =" author " content =" " . $self - > author . " "/ > " ; say " <body >" . $self -> body . " </ body >" ; } } 1; Llistat 3.4: lib/3.01/HTML.pm use 5.014; use Modern :: Perl ' 2012 '; package Doc 3.01 { use Moose ; has ' title ', is => 'ro ', isa => ' Str '; has ' body ', is => 'ro ', isa => ' Str '; has ' tag_list ', is => 'ro ', isa = > ' ArrayRef [ Str ] '; has ' author ', is => 'ro ', isa = > ' Str '; } 1; Llistat 3.5: lib/3.01/Doc.pm use 5.014; use Modern :: Perl ' 2012 '; use lib ' lib /3.01 '; use Doc 3.01; use Moose :: Util qw ( apply_all_roles ); my $r = Doc -> new ( title => 'T ', body = > 'B ', author = > 'A ' ); apply_all_roles ( $r , ' HTML ' ); $r -> print_html if $r -> DOES ( ' HTML ' ); Llistat 3.6: doc2.pl 21