X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=adf159fe30bf349b099b01d6b87ecaad19794af6;hb=c030f6e8ffa441ca1cfa386722aa5a44b8c2a99a;hp=70bdfc651c96000d181fa3e1664ae8a5fe5a06b6;hpb=c1d605dbbaf56eed6436ec8821158c509b8210fe;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 70bdfc6..adf159f 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -52,7 +52,7 @@ img#me05 {top: 43px;left: 36px;}

Introduction to Moose

-

git://git.moose.perl.org/moose-presentations.git

+

Dave Rolsky

@@ -71,7 +71,8 @@ img#me05 {top: 43px;left: 36px;}
@@ -218,7 +219,7 @@ use Moose; @@ -275,7 +276,7 @@ has weight => ( ); # kaboom -Person->new( weight => 'fat' ); +Person->new( weight => 'heavy' );
@@ -300,8 +301,8 @@ has blog_uri => ( handles => { 'blog_host' => 'host' }, ); -$person->blog_host; -# really calls $person->blog_uri->host +$person->blog_host; +# really calls $person->blog_uri->host
@@ -842,6 +843,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

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

BUILDARGS

@@ -941,11 +952,11 @@ sub BUILD {
Person->new(@_)
-
    +
    1. Calls Person->BUILDARGS(@_) to turn @_ into a hashref
    2. Blesses a reference
    3. Populates attributes based on the hashref from #1
    4. -
    5. Calls $new_object->BUILDALL($constructor_args) +
    6. Calls $new_object->BUILDALL($constructor_args)
      ... which calls all BUILD methods
    7. Returns the object
    @@ -957,6 +968,7 @@ sub BUILD { @@ -966,6 +978,7 @@ sub BUILD { @@ -1029,6 +1042,7 @@ extends 'LWP'; @@ -1056,6 +1070,7 @@ use Moose;
  1. Mostly like $self->SUPER::work(@_)
  2. But cannot change @_!
  3. Binds the parent's method at compile time
  4. +
  5. Parent determined by checking Child->meta()->superclasses()
  6. @@ -1096,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 @@ -1116,7 +1130,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends'); + + +
    +

    Basic Attributes Summary

    + +
    -

    What is a Method Modifier

    +

    What Are Method Modifiers For?

    @@ -2362,7 +2348,7 @@ after clear_password => sub { $self->$orig( $self->_munge_insert(@_) ); - $new_user->_assign_uri; + $new_user->_assign_uri; return $new_user; }; @@ -2426,6 +2412,7 @@ around run => sub { @@ -2434,19 +2421,21 @@ around run => sub {

    Augment and Inner

    -
    package Document;
    +  
    package Document;
     
     sub xml { '<doc>' . inner() . '</doc>' }
     
     package Report;
     extends 'Document';
     augment xml =>
    -    sub { title() . inner() . summary() };
    +    sub { my $self = shift;
    +          $self->title() . inner() . $self->summary() };
     
     package TPSReport;
     extends 'Report';
     augment xml =>
    -    sub { tps_xml() . inner() };
    + sub { my $self = shift; + $self->tps_xml() . inner() };
    @@ -2568,11 +2557,11 @@ Item Undef Defined Value - Num - Int - Str - ClassName - RoleName + Str + Num + Int + ClassName + RoleName
    @@ -2590,7 +2579,7 @@ Item CodeRef RegexpRef GlobRef - FileHandle + FileHandle Object @@ -2621,6 +2610,7 @@ undef @@ -2721,9 +2711,11 @@ has start_date => (

    Subtype Shortcuts - class_type

    use Moose::Util::TypeConstraints;
    -class_type 'DateTime';
    +class_type 'DateTime';
    + +
    -subtype 'DateTime', +
    subtype     'DateTime',
         as      'Object',
         where   { $_->isa('DateTime') },
         message { ... };
    @@ -2733,10 +2725,12 @@ subtype 'DateTime',

    Subtype Shortcuts - role_type

    use Moose::Util::TypeConstraints;
    -role_type 'Printable';
    +role_type 'Printable';
    -subtype 'Printable', - as 'Object', +
    + +
    subtype 'Printable',
    +    as  'Object',
         where
             { Moose::Util::does_role(
                   $_, 'Printable' ) },
    @@ -2747,9 +2741,11 @@ subtype 'Printable',
       

    Subtype Shortcuts - duck_type

    use Moose::Util::TypeConstraints;
    -duck_type Car => qw( run break_down );
    +duck_type Car => qw( run break_down );
    -subtype 'Car', +
    + +
    subtype 'Car',
         as      'Object',
         where   { all { $_->can($_) }
                   qw( run break_down ) },
    @@ -2760,12 +2756,14 @@ subtype 'Car',
       

    Subtype Shortcuts - enum

    use Moose::Util::TypeConstraints;
    -enum Color => qw( red blue green ) );
    +enum Color => qw( red blue green );
    + +
    -my %ok = map { $_ => 1 } +
    my %ok = map { $_ => 1 }
                  qw( red blue green );
     
    -subtype 'Color'
    +subtype     'Color'
         as      'Str',
         where   { $ok{$_} },
         message { ... };
    @@ -2881,6 +2879,19 @@ no Moose;
    +

    Questions So Far?

    +
    + +
    +

    Exercises

    + +
    # cd exercises
    +# perl bin/prove -lv t/05-types.t
    +
    +Iterate til this passes all its tests
    +
    + +

    Typed Methods (Low-tech)

    package Person;
    @@ -3011,9 +3022,9 @@ coerce ArrayOfInt
     
     use MyApp::Types qw( ArrayOfInt );
     
    -has transaction_history => (
    -    is  => 'rw',
    -    isa => ArrayOfInt,
    +has transaction_history => (
    +    is  => 'rw',
    +    isa => ArrayOfInt,
     );
    @@ -3023,7 +3034,7 @@ has transaction_history => (
    • Type names are exported functions, catches typos early
    • Types must be pre-declared
    • -
    • Types are stored with namespaces internally, but externally are short
    • +
    • Types are stored with namespaces internally, but you use short names
    • Import existing Moose types as functions from MooseX::Types::Moose
    • Still need string names for things like ArrayRef['Email::Address']
    @@ -3036,7 +3047,7 @@ has transaction_history => (
  7. Catches typos at compile time
  8. Automatic namespacing
  9. One more thing to install and learn
  10. -
  11. Every name gets types twice (declared and then defined)
  12. +
  13. Every name is typed twice (declared and then defined)
  14. Still stuck with strings when referring to class or role names
  15. Coercion gotcha from earlier still applies to types exported from MooseX::Types::Moose
  16. @@ -3057,15 +3068,6 @@ has transaction_history => (

    Questions?

    -
    -

    Exercises

    - -
    # cd exercises
    -# perl bin/prove -lv t/05-types.t
    -
    -Iterate til this passes all its tests
    -
    -

    Part 6: Advanced Attributes

    @@ -3163,7 +3165,7 @@ $alice->friend($bob);
    after salary_level => {
         my $self = shift;
    -    return unless @_;
    +    return unless @_;
         $self->clear_salary;
     };
    @@ -3175,11 +3177,22 @@ $alice->friend($bob);
    has salary_level => (
         is      => 'rw',
    -    trigger => sub { $_[0]->clear_salary },
    +    trigger =>
    +        sub { $_[0]->clear_salary },
     );
    +

    Trigger Arguments

    + +
      +
    • $self
    • +
    • $new_value
    • +
    • $old_value - if one exists
    • +
    +
    + +

    Delegation

      @@ -3195,7 +3208,7 @@ $alice->friend($bob); has lungs => ( is => 'ro', - isa => 'Lungs', + isa => 'Lungs', handles => [ 'inhale', 'exhale' ], ); @@ -3236,6 +3249,7 @@ has lungs => (

      Array Reference

        +
      • 1-to-1 mapping
      • Takes each method name and creates a simple delegation from the delegating class to the delegatee attribute
    @@ -3358,7 +3372,7 @@ has history => ( use Moose; has _favorite_numbers => ( traits => [ 'Array' ], - is => 'ro', + is => 'bare', isa => 'ArrayRef[Int]', default => sub { [] }, init_arg => undef, @@ -3396,7 +3410,7 @@ print "$_\n"
  17. Bool - set, toggle, ...
  18. Hash - get, set, ...
  19. Array - already saw it
  20. -
  21. Code - execute, that's it
  22. +
  23. Code - execute and execute_method
  24. @@ -3429,6 +3443,14 @@ has account => (
    +

    Curried Delegation

    + +
    $person->receive_100;
    +# really is
    +$person->account->deposit(100);
    +
    + +

    Traits and Metaclasses

      @@ -3453,7 +3475,7 @@ has account => (

      Traits and Metaclasses

        -
      • Can add/alter/remove attribute parameter (from has)
      • +
      • Can add/alter/remove an attribute parameter (from has)
      • Can change behavior of created attribute
    @@ -3511,15 +3533,12 @@ print Person->meta
  25. Use weak_ref to avoid circular references
  26. Use trigger to do an action post-attribute write
  27. Use delegations to hide "internal" objects
  28. +
  29. Use native delegations to treat Perl types as objects
  30. Traits and metaclasses let you extend Moose's core attribute features
  31. -

    Questions?

    -
    - -

    Exercises

    # cd exercises
    @@ -3529,20 +3548,28 @@ print Person->meta
     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 Brief Tour of MooseX

    +

    Bonus: A Brief Tour of MooseX

    -

    Notable Moose Extensions on CPAN

    +

    Notable MX Modules on CPAN

    • Not comprehensive
    • -
    • 128 MooseX distributions on CPAN as of 09/24/2009
    • +
    • 152 MooseX distributions on CPAN as of 02/02/2010
    • Some of them are crap
    @@ -3551,11 +3578,11 @@ Iterate til this passes all its tests

    Already Mentioned Several

      -
    • MooseX::NonMoose - best solution for subclassing non-Moose parents
    • -
    • MooseX::Declare - real Perl 5 OO
    • -
    • MooseX::FollowPBP and MooseX::SemiAffordanceAccessor
    • -
    • MooseX::Params::Validate and MooseX::Method::Signatures
    • -
    • MooseX::Types
    • +
    • MooseX::NonMoose - best solution for subclassing non-Moose parents
    • +
    • MooseX::Declare - real Perl 5 OO
    • +
    • MooseX::FollowPBP and MooseX::SemiAffordanceAccessor
    • +
    • MooseX::Params::Validate and MooseX::Method::Signatures
    • +
    • MooseX::Types
    @@ -3566,8 +3593,8 @@ Iterate til this passes all its tests use 5.10.0; # for say class Person { - has greeting - => ( is => 'ro', isa => 'Str' ); + has greeting => + ( is => 'ro', isa => 'Str' ); method speak { say $self->greeting; @@ -3582,6 +3609,7 @@ class Person {
  32. Still experimental-ish, but seeing more and more use
  33. Not a source filter!
  34. Hooks into the Perl parser rather than filtering all your code
  35. +
  36. But not supported by PPI, perltidy, etc.
  37. (yet?) @@ -3589,7 +3617,7 @@ class Person {

    MooseX::StrictConstructor

      -
    • By default, unknown constructor arguments are ignore
    • +
    • By default, unknown constructor arguments are ignored
    • MX::StrictConstructor turns these into an error
    @@ -3651,7 +3679,7 @@ use Moose; has file => ( is => 'ro', required => 1 ); has filters => - ( is => 'ro', isa => 'Str' ); + ( is => 'ro', isa => 'ArrayRef[Str]' ); sub run { ... } @@ -3667,7 +3695,7 @@ sub run { ... } use App::CLI; -App::CLI->new_with_options()->run(); +App::CLI->new_with_options()->run();
    $ myapp-cli \
        --file foo \
    @@ -3700,18 +3728,18 @@ my $clone  = $person->clone;

    MooseX::Role::Parameterized

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

    Questions?

    -
    -

    Part 9: Writing Moose Extensions

    -
    +
    +

    Moose-using Modules

    -
    -

    The End

    +

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

    + +
    @@ -3745,10 +3782,14 @@ with HasCollection => { type => 'Int' };
  38. mailing list - moose@perl.org
  39. Slides and exercises are in Moose's git repo:
    - git://jules.scsys.co.uk/gitmo/moose-presentations
  40. + git://jules.scsys.co.uk/gitmo/moose-presentations
    +
    +

    The End

    +
    +