X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=22cef8e555d859c71e0ceec4a9b99d002de5d6d2;hb=b8e08963464459d4f6dd8ccb03f74bf17813273f;hp=81db5110e0c836e97fb4fda9c219c3cf00c5d3b9;hpb=4a2daaa5e6a7a78149d61c25aee24eae9031e11b;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 81db511..22cef8e 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,7 +893,7 @@ use Moose;

BUILDARGS

@@ -1081,8 +1110,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 @@ -1101,7 +1129,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends'); @@ -3018,15 +3067,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

@@ -3090,7 +3130,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' ); @@ -3123,7 +3164,7 @@ $alice->friend($bob);
after salary_level => {
     my $self = shift;
-    return unless @_;
+    return unless @_;
     $self->clear_salary;
 };
@@ -3135,11 +3176,22 @@ $alice->friend($bob);
has salary_level => (
     is      => 'rw',
-    trigger => sub { $_[0]->clear_salary },
+    trigger =>
+        sub { $_[0]->clear_salary },
 );
+

Trigger Arguments

+ + +
+ +

Delegation

@@ -3209,7 +3262,6 @@ has lungs => (
package Person;
 use Moose;
-
 has account => (
     is      => 'ro',
     isa     => 'BankAccount',
@@ -3257,7 +3309,6 @@ has name => (
 
   
package Auditor;
 use Moose::Role;
-
 sub record_change  { ... }
 sub change_history { ... }
 
@@ -3285,6 +3336,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

    @@ -3309,7 +3474,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
@@ -3327,7 +3492,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
@@ -3346,7 +3510,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
@@ -3369,37 +3532,243 @@ print Person->meta
  • Use weak_ref to avoid circular references
  • Use trigger to do an action post-attribute write
  • Use delegations to hide "internal" objects
  • +
  • Use native delegations to treat Perl types as objects
  • Traits and metaclasses let you extend Moose's core attribute features
  • -

    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

    -
    -

    Part 9: Writing Moose Extensions

    +
    +

    Notable MX Modules on CPAN

    + +
      +
    • Not comprehensive
    • +
    • 152 MooseX distributions on CPAN as of 02/02/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 ... +

    + +
    @@ -3412,10 +3781,14 @@ 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
    +
    +

    The End

    +
    +