X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=6e8415c7dadaff7ba8bdb2d8661bb3c394683371;hb=1a2103f568e2d2b2522685fe814263f63dce3223;hp=909c58c4e36c923b71f0037a4043cfbfb67a2f4f;hpb=ff112bdd99035206b19013b897d4e190fd7f640b;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index 909c58c..6e8415c 100644 --- a/moose-class/slides/index.html +++ b/moose-class/slides/index.html @@ -40,7 +40,7 @@ img#me05 {top: 43px;left: 36px;} @@ -262,7 +275,7 @@ has weight => ( ); # kaboom -Person->new( weight => 'fat' ); +Person->new( weight => 'heavy' );
@@ -284,11 +297,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 +842,16 @@ has last_name => ( );
+
+

More Why Moose?

+ + +
+

Part 1: Moose Classes

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

BUILDARGS

@@ -1101,7 +1127,7 @@ print $person->first_name; # Dave use Moose; # true -Person->can('extends'); +Person->can('extends'); @@ -3110,7 +3173,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' ); @@ -3143,7 +3207,7 @@ $alice->friend($bob);
after salary_level => {
     my $self = shift;
-    return unless @_;
+    return unless @_;
     $self->clear_salary;
 };
@@ -3155,11 +3219,22 @@ $alice->friend($bob);
has salary_level => (
     is      => 'rw',
-    trigger => sub { $_[0]->clear_salary },
+    trigger =>
+        sub { $_[0]->clear_salary },
 );
+

Trigger Arguments

+ + +
+ +

Delegation

@@ -3229,7 +3305,6 @@ has lungs => (
package Person;
 use Moose;
-
 has account => (
     is      => 'ro',
     isa     => 'BankAccount',
@@ -3277,7 +3352,6 @@ has name => (
 
   
package Auditor;
 use Moose::Role;
-
 sub record_change  { ... }
 sub change_history { ... }
 
@@ -3310,15 +3384,34 @@ has history => (
   
  • 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

+

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       => 'ro',
@@ -3330,31 +3423,74 @@ has _favorite_numbers => (
         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

    -
  • Automatically defaults to []
  • +
  • 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
    • +
    +
-

Native Delegation - Counter

+

Curried Delegation

-
package Stack;
-use Moose;
+  
    +
  • A delegation with some preset arguments
  • +
  • Works with object or Native delegation
  • +
+
-has depth => ( - traits => [ 'Counter' ], - is => 'ro', - isa => 'Int', - default => 0, - init_arg => undef, - handles => - { _inc_depth => 'inc', - _dec_depth => 'dec', - }, +
+

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

@@ -3381,7 +3517,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
@@ -3399,7 +3535,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
@@ -3418,7 +3553,6 @@ has ssn => ( isa => 'Str', label => 'Social Security Number', ); - print Person->meta ->get_attribute('ssn')->label;
@@ -3453,7 +3587,8 @@ print Person->meta

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
@@ -3463,9 +3598,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

+ + +
+ +
+

Already Mentioned Several

+ + +
+ +
+

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

+ + +
+ +
+

MooseX::StrictConstructor

+ + +
+ +
+

MooseX::StrictConstructor

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

MooseX::Traits

+ + +
+ +
+

MooseX::Traits

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

MooseX::Getopt

+ + +
+ +
+

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

+ + + +
#!/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

+ + +
+ +
+

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 +3810,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