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=973b8258e0dda8540169e302fc89dc72abbe7abe;hpb=86178e0ffcf4959d0a172395daa66421137fb2fe;p=gitmo%2Fmoose-presentations.git
diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html
index 973b825..6e8415c 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
-
+
Dave Rolsky
@@ -218,7 +218,7 @@ use Moose;
- AKA advice
- "Before foo(), do this first"
- - "Do this after foo()
+ - "Do this after foo()"
- "Put this code around foo()"
@@ -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
@@ -955,7 +955,7 @@ sub BUILD {
Calls Person->BUILDARGS(@_)
to turn @_
into a hashref
Blesses a reference
Populates attributes based on the hashref from #1
- Calls $new_object->BUILDALL($constructor_args)
+ Calls $new_object->BUILDALL($constructor_args)
... which calls all BUILD
methods
Returns the object
@@ -1066,6 +1066,7 @@ use Moose;
Mostly like $self->SUPER::work(@_)
But cannot change @_
!
Binds the parent's method at compile time
+ Parent determined by checking Child->meta()->superclasses()
@@ -1126,7 +1127,7 @@ print $person->first_name; # Dave
use Moose;
# true
-Person->can('extends');
+Person->can('extends');
- Not very hygienic
@@ -1141,17 +1142,31 @@ use Moose;
...
-no Moose;
+no Moose;
+
+# false
+Person->can('extends');
+
+
+
+
Cleaning Up Moose Droppings
+
+
package Person;
+use namespace::autoclean;
+use Moose;
+
+...
# false
-Person->can('extends');
+Person->can('extends');
No Moose
- no Moose
at the end of a package is a best practice
+ - Cleaning up is a best practice
+ - Say
no Moose
at the end of a package
- Or
use namespace::autoclean
at the top
- Just do it
@@ -1161,13 +1176,13 @@ Person->can('extends');
Immutability
- - Stevan's Incantation of Fleet-Footedness
+ - Stevan's Incantation of Fleet-Footedness
package Person;
use Moose;
-__PACKAGE__->meta->make_immutable;
+
__PACKAGE__->meta->make_immutable;
@@ -1353,7 +1368,7 @@ sub print {
# or ...
-Person->meta->does('Printable')
+Person->meta->does_role('Printable')
@@ -1456,9 +1471,9 @@ use Moose;
sub break {
my $self = shift;
- $self->break_it_down;
+ $self->break_it_down;
if ( rand(1) < 0.5 ) {
- $self->break_bone;
+ $self->break_bone;
}
}
@@ -1475,7 +1490,7 @@ sub break {
-
Hot Role-on-Role Action
+
Roles With Roles
package Comparable;
use Moose::Role;
@@ -1484,7 +1499,7 @@ requires 'compare';
-
Hot Role-on-Role Action
+
Roles With Roles
package TestsEquality;
use Moose::Role;
@@ -1493,7 +1508,7 @@ with 'Comparable';
sub is_equal {
my $self = shift;
- return $self->compare(@_) == 0;
+ return $self->compare(@_) == 0;
}
@@ -1508,8 +1523,8 @@ with 'TestsEquality';
# Satisfies the Comparable role
sub compare { ... }
-Integer->does('TestsEquality'); # true
-Integer->does('Comparable'); # also true!
+Integer->does('TestsEquality'); # true
+Integer->does('Comparable'); # also true!
@@ -1616,7 +1631,7 @@ has [ 'left', 'right' ] => (
use Moose::Util qw( apply_all_roles );
-my $fragile_person = Person->new( ... );
+my $fragile_person = Person->new( ... );
apply_all_roles( $fragile_person,
'IsFragile' );
@@ -1772,8 +1787,8 @@ has first_name => (
required => 1,
);
-
Person->new( first_name => undef ); # ok
-Person->new(); # kaboom
+
Person->new( first_name => undef ); # ok
+Person->new(); # kaboom
@@ -1866,7 +1881,8 @@ has packages => (
use Moose;
my $highlander_bank =
- Bank->new( name => 'Spire FCU' );
+ Bank->new(
+ name => 'Clan MacLeod Trust' );
has bank => (
is => 'rw',
@@ -1878,7 +1894,8 @@ has bank => (
Builder
- - A method name which returns the default
+ - A method name
+ - When called, this method returns the default value
@@ -1952,7 +1969,8 @@ has bank => (
use Moose;
has shoe_size => (
- is => 'ro',
+ is => 'ro',
+ required => 'ro',
);
@@ -2040,11 +2058,11 @@ has shoe_size => (
init_arg => 'foot_size',
);
-Person->new( shoe_size => 13 );
+Person->new( shoe_size => 13 );
my $person =
- Person->new( foot_size => 13 );
-print $person->shoe_size;
+ Person->new( foot_size => 13 );
+print $person->shoe_size;
@@ -2058,7 +2076,7 @@ has shoes => (
init_arg => undef,
);
-Person->new( shoes => Shoes->new );
+Person->new( shoes => Shoes->new );
@@ -2205,6 +2223,13 @@ has first_name => (
- Attributes can have a
default
or builder
- Attributes with a default or builder can be
lazy
- Attributes can have a
clearer
and/or predicate
+
+
+
+
+
Basic Attributes Summary
+
+
- An attribute's constructor name can be changed with
init_arg
- A subclass can alter its parents' attributes
- Attribute accessor names can be changed
@@ -2234,18 +2259,18 @@ Iterate til this passes all its tests
- Apply to an existing method
- - ... from a parent class, the current class, or a role
+ - ... that comes from a parent class, the current class, or a role
- Roles can provide modifiers that are applied at composition time
-
What is a Method Modifier
+
What Are Method Modifiers For?
- "Inject" behavior
- Add behavior to generated methods (accessors, delegations)
- - Provide roles which modify existing behavior
+ - Added from a role, can modify existing behavior
@@ -2372,7 +2397,7 @@ after clear_password => sub {
$self->$orig(
$self->_munge_insert(@_) );
- $new_user->_assign_uri;
+ $new_user->_assign_uri;
return $new_user;
};
@@ -2436,6 +2461,7 @@ around run => sub {
- Inverted
super
- From least- to most-specific
+ - Like Mason's autohandler feature
- Grandparent to parent to child
- Not allowed in roles
@@ -2578,11 +2604,10 @@ Item
Undef
Defined
Value
- Str
- Num
- Int
- ClassName
- RoleName
+ Str
+ Num
+ Int
+ ClassName
@@ -2600,7 +2625,7 @@ Item
CodeRef
RegexpRef
GlobRef
- FileHandle
+ FileHandle
Object
@@ -2732,9 +2757,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,9 +2771,11 @@ subtype 'DateTime',
Subtype Shortcuts - role_type
use Moose::Util::TypeConstraints;
-role_type 'Printable';
+role_type 'Printable';
-subtype 'Printable',
+
+
+subtype 'Printable',
as 'Object',
where
{ Moose::Util::does_role(
@@ -2758,9 +2787,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,9 +2802,11 @@ 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'
@@ -3034,7 +3067,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 +3080,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
@@ -3174,7 +3207,7 @@ $alice->friend($bob);
after salary_level => {
my $self = shift;
- return unless @_;
+ return unless @_;
$self->clear_salary;
};
@@ -3186,11 +3219,22 @@ $alice->friend($bob);
has salary_level => (
is => 'rw',
- trigger => sub { $_[0]->clear_salary },
+ trigger =>
+ sub { $_[0]->clear_salary },
);
+
Trigger Arguments
+
+
+ $self
+ $new_value
+ $old_value
- if one exists
+
+
+
+
Delegation
@@ -3247,6 +3291,7 @@ has lungs => (
Array Reference
+ - 1-to-1 mapping
- Takes each method name and creates a simple delegation from the delegating class to the delegatee attribute
@@ -3407,7 +3452,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 +3517,7 @@ $person->account->deposit(100);
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
@@ -3561,7 +3606,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
@@ -3671,7 +3716,7 @@ use Moose;
has file =>
( is => 'ro', required => 1 );
has filters =>
- ( is => 'ro', isa => 'Str' );
+ ( is => 'ro', isa => 'ArrayRef[Str]' );
sub run { ... }
@@ -3687,7 +3732,7 @@ sub run { ... }
use App::CLI;
-App::CLI->new_with_options()->run();
+App::CLI->new_with_options()->run();
$ myapp-cli \
--file foo \
@@ -3765,7 +3810,7 @@ with HasCollection => { type => 'Int' };
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