X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=e2e889a1a72d032d6527ae0358e029615f2400dc;hb=d7deb8a91eda73a9252643bc0b221dd6e5d34482;hp=c0b9aaedfd4aca657773f777a351fc88798799d0;hpb=636ceec10724c15edeb555e07630b261e094e74c;p=gitmo%2Fmoose-presentations.git diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html index c0b9aae..e2e889a 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');
-

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 ... +

+ +
@@ -3273,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

    +
    +