X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=678bd94e8d762c170df76c30183c160423a7c8c5;hb=aadb685d19dae9cc8e146db1882e9dd70bd24fc0;hp=2a1be675a85dc02978b3eedf1402fcc12e14a3f1;hpb=de668480a7241b4aca987a0a252bfb738ea10f0d;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 2a1be67..678bd94 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -40,7 +40,7 @@ img#me05 {top: 43px;left: 36px;} @@ -235,7 +246,10 @@ after 'foo' my @return = $self->$real_foo( @_, bar => 42 ); - return ( @return, 'modify return values' ); + return ( + @return, + 'modify return values' + ); }; @@ -262,7 +276,7 @@ has weight => ( ); # kaboom -Person->new( weight => 'fat' ); +Person->new( weight => 'heavy' );
@@ -284,11 +298,11 @@ use Moose; has blog_uri => ( is => 'rw', isa => 'URI', - handles => { 'blog_hostname' => 'host' }, + handles => { 'blog_host' => 'host' }, ); -$person->blog_hostname; -# really calls $person->blog_uri->host +$person->blog_host; +# really calls $person->blog_uri->host
@@ -829,6 +843,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

@@ -869,8 +893,8 @@ use Moose;

BUILDARGS

@@ -885,10 +909,9 @@ use Moose; sub BUILDARGS { my $class = shift; - if ( @_ == 1 && ! ref $_[0] ) { + if ( @_ == 1 && ! ref $_[0] ) { return { ssn => $_[0] }; } - return $class->SUPER::BUILDARGS(@_); } @@ -925,11 +948,37 @@ sub BUILD {
+

Object Construction a la Moose

+ +
Person->new(@_)
+ +
    +
  1. Calls Person->BUILDARGS(@_) to turn @_ into a hashref
  2. +
  3. Blesses a reference
  4. +
  5. Populates attributes based on the hashref from #1
  6. +
  7. Calls $new_object->BUILDALL($constructor_args) +
    ... which calls all BUILD methods
  8. +
  9. Returns the object
  10. +
+
+ +
+

The Object is Opaque

+ + +
+ +

DEMOLISH

@@ -938,6 +987,8 @@ sub BUILD {
package Employee;
@@ -991,6 +1042,7 @@ extends 'LWP';
@@ -1002,12 +1054,13 @@ use Moose; extends 'Person'; -override work => sub { +override work => sub { my $self = shift; - die "Pay me first" unless $self->got_paid; - super(); -}; + die "Pay me first" + unless $self->got_paid; + super(); +};
@@ -1017,6 +1070,7 @@ use Moose;
  • Mostly like $self->SUPER::work(@_)
  • But cannot change @_!
  • Binds the parent's method at compile time
  • +
  • Parent determined by checking Child->meta()->superclasses()
  • @@ -1057,8 +1111,7 @@ has first_name => ( is => 'ro' ); my $person = Person->new( first_name => 'Dave' ); -$person->first_name('Stevan'); -print $person->first_name; # Dave +$person->first_name('Stevan'); # dies @@ -1077,7 +1130,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends');
    -

    Questions?

    -
    - -

    Exercises

    # cd exercises
    -# perl bin/prove -lv t/06-advanced-attributes.t
    +# perl bin/prove -lv \
    +      t/06-advanced-attributes.t
     
     Iterate til this passes all its tests
    -
    -

    Part 7: Introspection

    +
    +

    CYOA

    + +

    + If there is time, keep going ... +

    + +

    + Otherwise, jump to slide 269 ... +

    -

    Part 8: A Tour of MooseX

    +

    Bonus: A Brief Tour of MooseX

    +
    + +
    +

    Notable MX Modules on CPAN

    + + +
    + +
    +

    Already Mentioned Several

    + + +
    + +
    +

    MooseX::Declare

    + +
    use MooseX::Declare;
    +use 5.10.0; # for say
    +
    +class Person {
    +    has greeting =>
    +        ( is => 'ro', isa => 'Str' );
    +
    +    method speak {
    +        say $self->greeting;
    +    }
    +}
    +
    + +
    +

    MooseX::Declare

    + + +
    + +
    +

    MooseX::StrictConstructor

    + + +
    + +
    +

    MooseX::StrictConstructor

    + +
    package Person;
    +
    +use Moose;
    +use MooseX::StrictConstructor;
    +
    +has name => ( is => 'ro' );
    +
    +Person->new
    +    ( nane => 'Ringo Shiina' ); # kaboom
    +
    + +
    +

    MooseX::Traits

    + + +
    + +
    +

    MooseX::Traits

    + +
    package MyApp::Thingy;
    +use Moose;
    +
    +with 'MooseX::Traits';
    +
    +my $thing =
    +    MyApp::Thingy->new_with_traits
    +        ( traits => [ 'Foo', 'Bar' ],
    +          size   => 42 );
    +
    + +
    +

    MooseX::Getopt

    + + +
    + +
    +

    MooseX::Getopt

    + +
    package App::CLI;
    +use Moose;
    +
    +with 'MooseX::Getopt';
    +
    +has file    =>
    +    ( is => 'ro', required => 1 );
    +has filters =>
    +    ( is => 'ro', isa => 'ArrayRef[Str]' );
    +
    +sub run { ... }
    +
    + +
    +

    MooseX::Getopt

    + + + +
    #!/usr/bin/perl
    +
    +use App::CLI;
    +
    +App::CLI->new_with_options()->run();
    + +
    $ myapp-cli \
    +   --file foo \
    +   --filters compress \
    +   --filters sanitize
    +
    + +
    +

    MooseX::Clone

    + +
    package Person;
    +
    +use Moose;
    +with 'MooseX::Clone';
    +
    +my $person = Person->new;
    +my $clone  = $person->clone;
    +
    + +
    +

    MooseX::NonMoose

    + + +
    + +
    +

    MooseX::Role::Parameterized

    + +
    package HasCollection;
    +use MooseX::Role::Parameterized;
    +parameter type => ( isa     => 'Str',
    +                    default => 'Item' );
    +role {
    +    my $p = shift;
    +
    +    my $type =
    +        'ArrayRef[' . $p->type() . ']';
    +    has collection =>
    +        ( is  => 'ro',
    +          isa => $type );
    +};
    +
    + +
    +

    MooseX::Role::Parameterized

    + +
    package Person;
    +
    +use Moose;
    +with HasCollection => { type => 'Int' };
    +
    + +
    +

    Questions?

    +
    + +
    +

    Moose-using Modules

    + +

    + For further reading, a few modules which use Moose ... +

    + + +
    + +
    +

    More Information

    + +
    -

    Part 9: Writing Moose Extensions

    +

    The End