X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=25bf289f4d5544023709644e812f4aeff3cee813;hb=137185647395c7ce62b7db523ba3781bd9c6b777;hp=979bbfa1c67af03fa3cc230f7f443bd2af009153;hpb=9b515ca454467f3399fadd456b7ed0945b30d618;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 979bbfa..25bf289 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -71,7 +71,8 @@ img#me05 {top: 43px;left: 36px;} @@ -154,7 +155,7 @@ img#me05 {top: 43px;left: 36px;}
package Person;
 use Moose;
 
-has first_name => ( is => 'rw' );
+has first_name => ( is => 'ro' ); @@ -892,8 +893,8 @@ use Moose;

BUILDARGS

@@ -967,6 +968,7 @@ sub BUILD { @@ -976,6 +978,7 @@ sub BUILD { @@ -1039,6 +1042,7 @@ extends 'LWP'; @@ -1050,13 +1054,13 @@ use Moose; extends 'Person'; -override work => sub { +override work => sub { my $self = shift; die "Pay me first" unless $self->got_paid; - super(); -}; + super(); +};
@@ -1065,7 +1069,7 @@ use Moose;
@@ -1107,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 @@ -1233,6 +1236,8 @@ use Moose; # perl install-moose (if needed) +## Read the instructions in t/01-classes.t + # perl bin/prove -lv t/01-classes.t # edit lib/Person.pm and lib/Employee.pm @@ -1304,23 +1309,25 @@ sub print {
package Person;
 use Moose;
 
-with 'HasPermissions';
+with 'Printable';

Classes Consume Roles

-
my $person = Person->new(
+
package Person;
+
+sub as_string { $_[0]->first_name() }
+
+...
+
+my $person = Person->new(
     first_name   => 'Kenichi',
     last_name    => 'Asai',
     access_level => 42,
 );
 
-print $person->full_name
-    . ' has '
-    . $person->can_access(42)
-        ? 'great power'
-        : 'little power';
+$person->print();
@@ -1428,64 +1435,12 @@ use Moose;
-

Method Aliasing

- -
package FragileDancer;
-use Moose;
-
-with 'IsFragile' =>
-         { -alias =>
-               { break => 'break_bone' } },
-     'CanBreakdance' =>
-         { -alias =>
-               { break => 'break_it_down' } };
- - -
- -
-

Method Exclusion

- -
package FragileDancer;
-use Moose;
-
-with 'IsFragile' =>
-         { -alias =>
-               { break => 'break_bone' },
-           -excludes => 'break' },
-     'CanBreakdance' =>
-         { -alias =>
-               { break => 'break_it_down' },
-           -excludes => 'break' };
-
- -
-

And then ...

- -
package FragileDancer;
-use Moose;
-
-sub break {
-    my $self = shift;
-
-    $self->break_it_down;
-    if ( rand(1) < 0.5 ) {
-        $self->break_bone;
-    }
-}
-
- -
-

Still Full of Fail

+

Conflicts Are a Smell

@@ -1578,7 +1533,7 @@ use Moose; with 'HasSize'; -has size => ( is => 'ro' ); +has size => ( is => 'ro' );
@@ -1592,7 +1547,7 @@ requires 'size'; package Shirt; use Moose; -has size => ( is => 'ro' ); +has size => ( is => 'ro' ); with 'HasSize';
@@ -1614,9 +1569,9 @@ with 'HasSize';
package Comparison;
 use Moose;
 
-has [ 'left', 'right' ] => (
-    is   => 'ro',
-    does => 'Comparable',
+has [ 'left', 'right' ] => (
+    is   => 'ro',
+    does => 'Comparable',
 );
 
@@ -1913,7 +1868,7 @@ has bank => ( sub _build_bank { my $self = shift; return Bank->new( - name => 'Spire FCU' ); + name => 'Spire FCU' ); } @@ -1970,7 +1925,7 @@ use Moose; has shoe_size => ( is => 'ro', - required => 'ro', + required => 1, ); @@ -1980,7 +1935,7 @@ has shoe_size => (
has shoes => (
     is      => 'ro',
     lazy    => 1,
-    builder => '_build_shoes',
+    builder => '_build_shoes',
 );
 
 sub _build_shoes {
@@ -2053,7 +2008,7 @@ has account => (
   
package Person;
 use Moose;
 
-has shoe_size => (
+has shoe_size => (
     is       => 'ro',
     init_arg => 'foot_size',
 );
@@ -2071,7 +2026,7 @@ print $person->shoe_size;
package Person;
 use Moose;
 
-has shoes => (
+has shoes => (
     is       => 'ro',
     init_arg => undef,
 );
@@ -2470,19 +2425,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() };
@@ -2608,6 +2565,7 @@ Item Num Int ClassName + RoleName
@@ -2634,15 +2592,12 @@ Item

Bool

True

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

False

0
-0.0
 '0'
+''
 undef

-
subtype 'DateTime',
+
subtype     'DateTime',
     as      'Object',
     where   { $_->isa('DateTime') },
     message { ... };
@@ -2776,7 +2731,7 @@ role_type 'Printable';

subtype 'Printable',
-    as      'Object',
+    as  'Object',
     where
         { Moose::Util::does_role(
               $_, 'Printable' ) },
@@ -2802,14 +2757,14 @@ duck_type Car => qw( run break_down );

Subtype Shortcuts - enum

use Moose::Util::TypeConstraints;
-enum Color => qw( red blue green ) );
+enum Color => qw( red blue green );

my %ok = map { $_ => 1 }
              qw( red blue green );
 
-subtype 'Color'
+subtype     'Color'
     as      'Str',
     where   { $ok{$_} },
     message { ... };
@@ -2925,6 +2880,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;
@@ -3055,9 +3023,9 @@ coerce ArrayOfInt
 
 use MyApp::Types qw( ArrayOfInt );
 
-has transaction_history => (
-    is  => 'rw',
-    isa => ArrayOfInt,
+has transaction_history => (
+    is  => 'rw',
+    isa => ArrayOfInt,
 );
@@ -3101,15 +3069,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

@@ -3250,7 +3209,7 @@ $alice->friend($bob); has lungs => ( is => 'ro', - isa => 'Lungs', + isa => 'Lungs', handles => [ 'inhale', 'exhale' ], ); @@ -3414,7 +3373,7 @@ has history => ( use Moose; has _favorite_numbers => ( traits => [ 'Array' ], - is => 'ro', + is => 'bare', isa => 'ArrayRef[Int]', default => sub { [] }, init_arg => undef, @@ -3575,15 +3534,12 @@ 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
    @@ -3593,12 +3549,20 @@ 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

    @@ -3606,7 +3570,7 @@ Iterate til this passes all its tests
    • Not comprehensive
    • -
    • 152 MooseX distributions on CPAN as of 02/02/2010
    • +
    • 177 MooseX distributions on CPAN as of 09/21/2010
    • Some of them are crap
    @@ -3792,12 +3756,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 ... +

    + +
    @@ -3814,6 +3787,10 @@ with HasCollection => { type => 'Int' };
    +
    +

    The End

    +
    +