X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=ff7b8ab45eab045ace186a531289e951567eea75;hb=4b37a21f58441c0e5741e446de7c1f419c4a32db;hp=a44f504f875fff5a33dbc34ddd6e8efcea86914b;hpb=78204667be8035e186f28ab73d48f82e6799408d;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index a44f504..ff7b8ab 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -40,7 +40,7 @@ img#me05 {top: 43px;left: 36px;} @@ -236,7 +246,10 @@ after 'foo' my @return = $self->$real_foo( @_, bar => 42 ); - return ( @return, 'modify return values' ); + return ( + @return, + 'modify return values' + ); }; @@ -263,7 +276,7 @@ has weight => ( ); # kaboom -Person->new( weight => 'fat' ); +Person->new( weight => 'heavy' );
@@ -285,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
@@ -830,6 +843,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

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

BUILDARGS

@@ -889,7 +912,6 @@ sub BUILDARGS { if ( @_ == 1 && ! ref $_[0] ) { return { ssn => $_[0] }; } - return $class->SUPER::BUILDARGS(@_); } @@ -930,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
    @@ -946,6 +968,7 @@ sub BUILD { @@ -955,6 +978,7 @@ sub BUILD { @@ -963,6 +987,8 @@ sub BUILD {
    package Employee;
    @@ -1016,6 +1042,7 @@ extends 'LWP';
    @@ -1027,10 +1054,11 @@ use Moose; extends 'Person'; -override work => sub { +override work => sub { my $self = shift; - die "Pay me first" unless $self->got_paid; + die "Pay me first" + unless $self->got_paid; super(); }; @@ -1042,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. @@ -1082,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 @@ -1102,7 +1130,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends'); @@ -2177,9 +2150,17 @@ has first_name => (
  7. Attributes can have a default or builder
  8. Attributes with a default or builder can be lazy
  9. Attributes can have a clearer and/or predicate
  10. + + + +
    +

    Basic Attributes Summary

    + +
    @@ -2191,7 +2172,8 @@ has first_name => (

    Exercises

    # cd exercises
    -# perl bin/prove -lv t/03-basic-attributes.t
    +# perl bin/prove -lv \
    +      t/03-basic-attributes.t
     
     Iterate til this passes all its tests
    @@ -2205,18 +2187,18 @@ Iterate til this passes all its tests
    -

    What is a Method Modifier

    +

    What Are Method Modifiers For?

    @@ -2260,7 +2242,8 @@ before work => sub { my $self = shift; return unless $DEBUG; - warn "Called work on ", $self->full_name, + warn "Called work on ", + $self->full_name, "with the arguments: [@_]\n"; }; @@ -2292,19 +2275,17 @@ after work => sub {
    -

    Other Uses Example

    +

    More Modifier Examples

    has password => (
          is      => 'rw',
          clearer => 'clear_password',
     );
    -
     has hashed_password => (
          is      => 'ro',
          builder => '_build_hashed_password',
          clearer => '_clear_hashed_password',
     );
    -
     after clear_password => sub {
         my $self = shift;
         $self->_clear_hashed_password;
    @@ -2344,8 +2325,7 @@ after clear_password => sub {
             $self->$orig(
                 $self->_munge_insert(@_) );
     
    -    $new_user->_assign_uri;
    -
    +    $new_user->_assign_uri;
         return $new_user;
     };
    @@ -2354,7 +2334,7 @@ after clear_password => sub {

    Modifier Order

    @@ -2409,6 +2389,7 @@ around run => sub { @@ -2417,21 +2398,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() };
    @@ -2510,7 +2491,8 @@ extends 'Report';

    Exercises

    # cd exercises
    -# perl bin/prove -lv t/04-method-modifiers.t
    +# perl bin/prove -lv \
    +      t/04-method-modifiers.t
     
     Iterate til this passes all its tests
    @@ -2552,11 +2534,11 @@ Item Undef Defined Value - Num - Int - Str - ClassName - RoleName + Str + Num + Int + ClassName + RoleName @@ -2566,6 +2548,7 @@ Item
     (Item)
         (Defined)
    +        (Value)
             Ref
                 ScalarRef
                 ArrayRef[`a]
    @@ -2573,7 +2556,7 @@ Item
                 CodeRef
                 RegexpRef
                 GlobRef
    -              FileHandle
    +                FileHandle
                 Object
     
    @@ -2582,15 +2565,12 @@ Item

    Bool

    True

    -
    1
    -924.1
    -'true'
    -{}
    +
    1

    False

    0
    -0.0
     '0'
    +''
     undef
    @@ -3037,15 +3042,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

    @@ -3109,7 +3105,8 @@ $alice->friend($bob);
    use Moose; has name => ( is => 'ro' ); -has friend => ( is => 'rw', weak_ref => 1 ); +has friend => ( is => 'rw', + weak_ref => 1 ); my $alice = Person->new( name => 'Alice' ); my $bob = Person->new( name => 'Bob' ); @@ -3142,7 +3139,7 @@ $alice->friend($bob);
    after salary_level => {
         my $self = shift;
    -    return unless @_;
    +    return unless @_;
         $self->clear_salary;
     };
    @@ -3154,11 +3151,22 @@ $alice->friend($bob);
    has salary_level => (
         is      => 'rw',
    -    trigger => sub { $_[0]->clear_salary },
    +    trigger =>
    +        sub { $_[0]->clear_salary },
     );
    +

    Trigger Arguments

    + + +
    + +

    Delegation

    @@ -3228,7 +3237,6 @@ has lungs => (
    package Person;
     use Moose;
    -
     has account => (
         is      => 'ro',
         isa     => 'BankAccount',
    @@ -3276,7 +3284,6 @@ has name => (
     
       
    package Auditor;
     use Moose::Role;
    -
     sub record_change  { ... }
     sub change_history { ... }
     
    @@ -3304,6 +3311,120 @@ has history => (
     
     
     
    +

    Native Delegation

    + +
      +
    • Delegate to unblessed Perl types
    • +
    • Scalar, array or hash ref, etc
    • +
    • Treat Perl types as objects
    • +
    • Still uses handles
    • +
    • Pretend that native Perl types have methods
    • +
    +
    + +
    +

    Native Delegation - Array(Ref)

    + +
      +
    • Methods include: +
        +
      • push
      • +
      • shift
      • +
      • elements - returns all elements
      • +
      • count
      • +
      • is_empty
      • +
      • quite a few more
      • +
      +
    • +
    +
    + +
    +

    Native Delegation - Array(Ref)

    + +
    package Person;
    +use Moose;
    +has _favorite_numbers => (
    +    traits   => [ 'Array' ],
    +    is       => 'bare',
    +    isa      => 'ArrayRef[Int]',
    +    default  => sub { [] },
    +    init_arg => undef,
    +    handles  =>
    +      { favorite_numbers    => 'elements',
    +        add_favorite_number => 'push',
    +      },
    +);
    +
    + +
    +

    Native Delegation - Array(Ref)

    + +
    my $person = Person->new();
    +
    +$person->add_favorite_number(7);
    +$person->add_favorite_number(42);
    +
    +print "$_\n"
    +    for $person->favorite_numbers;
    +
    +# 7
    +# 42
    +
    + +
    +

    Native Delegation

    + +
      +
    • Native types are ... +
        +
      • Number - add, mul, ...
      • +
      • String - append, chop, ...
      • +
      • Counter - inc, dec, ...
      • +
      • Bool - set, toggle, ...
      • +
      • Hash - get, set, ...
      • +
      • Array - already saw it
      • +
      • Code - execute and execute_method
      • +
      +
    • +
    +
    + +
    +

    Curried Delegation

    + +
      +
    • A delegation with some preset arguments
    • +
    • Works with object or Native delegation
    • +
    +
    + +
    +

    Curried Delegation

    + +
    package Person;
    +use Moose;
    +has account => (
    +    is      => 'ro',
    +    isa     => 'BankAccount',
    +    handles => {
    +        receive_100 =>
    +            [ 'deposit', 100 ]
    +        give_100    =>
    +            [ 'withdraw', 100 ]
    +    },
    +);
    +
    + +
    +

    Curried Delegation

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

    Traits and Metaclasses

      @@ -3328,7 +3449,7 @@ has history => (

      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
    @@ -3346,7 +3467,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
    @@ -3365,7 +3485,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
    @@ -3388,37 +3507,243 @@ print Person->meta
  11. Use weak_ref to avoid circular references
  12. Use trigger to do an action post-attribute write
  13. Use delegations to hide "internal" objects
  14. +
  15. Use native delegations to treat Perl types as objects
  16. Traits and metaclasses let you extend Moose's core attribute features
  17. -

    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 268 ... +

    -

    Part 8: A Tour of MooseX

    +

    Bonus: A Brief Tour of MooseX

    -
    -

    Part 9: Writing Moose Extensions

    +
    +

    Notable MX Modules on CPAN

    + +
      +
    • Not comprehensive
    • +
    • 177 MooseX distributions on CPAN as of 09/21/2010
    • +
    • Some of them are crap
    • +
    -
    -

    The End

    +
    +

    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::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

    + +
      +
    • Still experimental-ish, but seeing more and more use
    • +
    • Not a source filter!
    • +
    • Hooks into the Perl parser rather than filtering all your code
    • +
    • But not supported by PPI, perltidy, etc.
    • (yet?) +
    +
    + +
    +

    MooseX::StrictConstructor

    + +
      +
    • By default, unknown constructor arguments are ignored
    • +
    • MX::StrictConstructor turns these into an error
    • +
    +
    + +
    +

    MooseX::StrictConstructor

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

    MooseX::Traits

    + +
      +
    • Combines object construction and role application
    • +
    • Makes it easy to create one-off customized objects
    • +
    +
    + +
    +

    MooseX::Traits

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

    MooseX::Getopt

    + +
      +
    • Makes command-line interface programs easy!
    • +
    • Construct an object from CLI arguments
    • +
    +
    + +
    +

    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

    + +
      +
    • Then call it like this:
    • +
    + +
    #!/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

    + +
      +
    • Highly recommended for subclassing non-Moose parents
    • +
    • Gets all the little annoying details right
    • +
    +
    + +
    +

    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 ... +

    + +
    @@ -3431,10 +3756,14 @@ Iterate til this passes all its tests
  18. mailing list - moose@perl.org
  19. Slides and exercises are in Moose's git repo:
    - git://jules.scsys.co.uk/gitmo/moose-presentations
  20. + git://git.moose.perl.org/moose-presentations/moose.git
    +
    +

    The End

    +
    +