X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=df47d7da6a22df25d3ad0adb40ca39d19134259d;hb=f5cc2f3e2e4b43900ab65afe4f5289d6ea551915;hp=64228049fc1921c11c82f68fefdc2685093fde9f;hpb=84326b8a3635da8d4c825df6f2862f4e4c536fcc;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 6422804..df47d7d 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

@@ -218,7 +218,7 @@ use Moose;
@@ -300,8 +300,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
@@ -892,7 +892,7 @@ use Moose;

BUILDARGS

@@ -1106,8 +1107,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 @@ -1126,7 +1126,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?

@@ -2372,7 +2344,7 @@ after clear_password => sub { $self->$orig( $self->_munge_insert(@_) ); - $new_user->_assign_uri; + $new_user->_assign_uri; return $new_user; }; @@ -2436,6 +2408,7 @@ around run => sub { @@ -2444,19 +2417,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() };
@@ -2578,11 +2553,11 @@ Item Undef Defined Value - Str - Num - Int - ClassName - RoleName + Str + Num + Int + ClassName + RoleName
@@ -2600,7 +2575,7 @@ Item CodeRef RegexpRef GlobRef - FileHandle + FileHandle Object @@ -2732,9 +2707,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 { ... };
@@ -2744,10 +2721,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' ) },
@@ -2758,9 +2737,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 ) },
@@ -2771,12 +2752,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 { ... };
@@ -2892,6 +2875,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;
@@ -3034,7 +3030,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']
@@ -3047,7 +3043,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
  • @@ -3068,15 +3064,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

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

    Trigger Arguments

    + + +
    + +

    Delegation

    @@ -3369,7 +3368,7 @@ has history => ( use Moose; has _favorite_numbers => ( traits => [ 'Array' ], - is => 'ro', + is => 'bare', isa => 'ArrayRef[Int]', default => sub { [] }, init_arg => undef, @@ -3407,7 +3406,7 @@ print "$_\n"
  • Bool - set, toggle, ...
  • Hash - get, set, ...
  • Array - already saw it
  • -
  • Code - execute, that's it
  • +
  • Code - execute and execute_method
  • @@ -3472,7 +3471,7 @@ $person->account->deposit(100);

    Traits and Metaclasses

    @@ -3530,6 +3529,7 @@ 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
  • @@ -3548,12 +3548,31 @@ print Person->meta Iterate til this passes all its tests +
    +

    Questions?

    +
    +
    -

    Part 7: Introspection

    +

    The End

    +
    + +
    +

    More Information

    + +
    +
    -

    Part 8: A Brief Tour of MooseX

    +

    Bonus: A Brief Tour of MooseX

    @@ -3561,7 +3580,7 @@ Iterate til this passes all its tests
    • 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
    @@ -3570,11 +3589,11 @@ Iterate til this passes all its tests

    Already Mentioned Several

    @@ -3585,8 +3604,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; @@ -3601,6 +3620,7 @@ class Person {
  • 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?) @@ -3608,7 +3628,7 @@ class Person {

    MooseX::StrictConstructor

    @@ -3670,7 +3690,7 @@ use Moose; has file => ( is => 'ro', required => 1 ); has filters => - ( is => 'ro', isa => 'Str' ); + ( is => 'ro', isa => 'ArrayRef[Str]' ); sub run { ... } @@ -3686,7 +3706,7 @@ sub run { ... } use App::CLI; -App::CLI->new_with_options()->run(); +App::CLI->new_with_options()->run();
    $ myapp-cli \
        --file foo \
    @@ -3742,30 +3762,8 @@ use Moose;
     with HasCollection => { type => 'Int' };
    -
    -

    Questions?

    -
    -
    -

    Part 9: Writing Moose Extensions

    -
    - -
    -

    The End

    -
    - -
    -

    More Information

    - - +

    The End (Really)