X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=b065633f79232569c9117da03886f1ee22399a65;hb=6960f4e1f61fa7cdb54cae31ce4e60d513469d6a;hp=b06c84cbaf5e3124493373b99fa6a25044f8a0fc;hpb=e5792e208871d019c032c26070105df2333a8e21;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index b06c84c..b065633 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -56,6 +56,16 @@ img#me05 {top: 43px;left: 36px;}
+

Introduce Yourselves

+ + +
+ +

Moose Summed Up

@@ -832,6 +842,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

@@ -872,7 +892,7 @@ use Moose;

BUILDARGS

@@ -1131,7 +1152,8 @@ Person->can('extends');

No Moose

@@ -1846,7 +1868,8 @@ has packages => ( use Moose; my $highlander_bank = - Bank->new( name => 'Spire FCU' ); + Bank->new( + name => 'Clan MacLeod Trust' ); has bank => ( is => 'rw', @@ -1858,7 +1881,8 @@ has bank => (

Builder

@@ -1932,7 +1956,8 @@ has bank => ( use Moose; has shoe_size => ( - is => 'ro', + is => 'ro', + required => 'ro', ); @@ -2185,6 +2210,13 @@ has first_name => (
  • Attributes can have a default or builder
  • Attributes with a default or builder can be lazy
  • Attributes can have a clearer and/or predicate
  • + + + +
    +

    Basic Attributes Summary

    + +
    -

    What is a Method Modifier

    +

    What Are Method Modifiers For?

    @@ -2416,6 +2448,7 @@ around run => sub { @@ -2558,11 +2591,10 @@ Item Undef Defined Value - Num - Int - Str - ClassName - RoleName + Str + Num + Int + ClassName @@ -2572,6 +2604,7 @@ Item
     (Item)
         (Defined)
    +        (Value)
             Ref
                 ScalarRef
                 ArrayRef[`a]
    @@ -2579,7 +2612,7 @@ Item
                 CodeRef
                 RegexpRef
                 GlobRef
    -              FileHandle
    +                FileHandle
                 Object
     
    @@ -2610,6 +2643,7 @@ undef @@ -2710,9 +2744,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 { ... };
    @@ -2722,9 +2758,11 @@ subtype 'DateTime',

    Subtype Shortcuts - role_type

    use Moose::Util::TypeConstraints;
    -role_type 'Printable';
    +role_type 'Printable';
    -subtype 'Printable', +
    + +
    subtype 'Printable',
         as      'Object',
         where
             { Moose::Util::does_role(
    @@ -2736,9 +2774,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 ) },
    @@ -2749,9 +2789,11 @@ 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'
    @@ -2830,7 +2872,7 @@ coerce 'My::DateTime',
         via  { [ $_ ] };
      -
    • Coerce instead of a union like Int | ArrayRef[Int]
    • +
    • Instead of union - Int | ArrayRef[Int]
    @@ -2882,7 +2924,7 @@ sub work { \@_, tasks => { isa => 'ArrayRef[Task]', - coerce =>1 }, + coerce => 1 }, can_rest => { isa => 'Bool', default => 0 }, @@ -3012,7 +3054,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']
    @@ -3025,7 +3067,7 @@ has transaction_history => (
  • Catches typos at compile time
  • Automatic namespacing
  • One more thing to install and learn
  • -
  • Every name gets types twice (declared and then defined)
  • +
  • Every name is typed twice (declared and then defined)
  • Still stuck with strings when referring to class or role names
  • Coercion gotcha from earlier still applies to types exported from MooseX::Types::Moose
  • @@ -3152,7 +3194,7 @@ $alice->friend($bob);
    after salary_level => {
         my $self = shift;
    -    return unless @_;
    +    return unless @_;
         $self->clear_salary;
     };
    @@ -3164,7 +3206,8 @@ $alice->friend($bob);
    has salary_level => (
         is      => 'rw',
    -    trigger => sub { $_[0]->clear_salary },
    +    trigger =>
    +        sub { $_[0]->clear_salary },
     );
    @@ -3225,6 +3268,7 @@ has lungs => (

    Array Reference

    @@ -3317,11 +3361,31 @@ has history => (
    -

    Native Delegation - Array

    +

    Native Delegation - Array(Ref)

    + + +
    + +
    +

    Native Delegation - Array(Ref)

    package Person;
     use Moose;
    @@ -3339,23 +3403,71 @@ has _favorite_numbers => (
     
    -

    Native Delegation - Counter

    +

    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

    -
    package Stack;
    +  
      +
    • 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 depth => (
    -    traits   => [ 'Counter' ],
    -    is       => 'ro',
    -    isa      => 'Int',
    -    default  => 0,
    -    init_arg => undef,
    -    handles  =>
    -      { _inc_depth => 'inc',
    -        _dec_depth => 'dec',
    -      },
    +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

    @@ -3382,7 +3494,7 @@ has depth => (

    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
    @@ -3463,9 +3575,200 @@ Iterate til this passes all its tests
    -

    Part 8: A Tour of MooseX

    +

    Part 8: A Brief Tour of MooseX

    +
    + +
    +

    Notable MX Modules on CPAN

    + +
      +
    • Not comprehensive
    • +
    • 152 MooseX distributions on CPAN as of 02/02/2010
    • +
    • Some of them are crap
    • +
    +
    + +
    +

    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?

    +
    +

    Part 9: Writing Moose Extensions

    @@ -3484,7 +3787,7 @@ Iterate til this passes all its tests
  • mailing list - moose@perl.org
  • Slides and exercises are in Moose's git repo:
    - git://jules.scsys.co.uk/gitmo/moose-presentations
  • + git://jules.scsys.co.uk/gitmo/moose-presentations