X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=moose-class%2Fslides%2Findex.html;h=e3814b78837583319bfb14b980b4d1a9edde0993;hb=3258951f22a6aed1774ec682fe4ad1365e154405;hp=7108b3f57b4f867ea3528ea0076dd14fc262bd55;hpb=6f51d05cfeb9122c2cfde8fdbe60333c43f3b1a3;p=gitmo%2Fmoose-presentations.git
diff --git a/moose-class/slides/index.html b/moose-class/slides/index.html
index 7108b3f..e3814b7 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
@@ -71,7 +71,8 @@ img#me05 {top: 43px;left: 36px;}
- Declarative OO sugar
- Introspectable
- - Extensible (MooseX::* on CPAN)
+ - Extensible (202 MooseX::* on CPAN)
+ - Community approved (1200+ downstream dependents on CPAN)
@@ -154,7 +155,7 @@ img#me05 {top: 43px;left: 36px;}
package Person;
use Moose;
-has first_name => ( is => 'rw' );
+has first_name => ( is => 'ro' );
@@ -218,7 +219,7 @@ use Moose;
- AKA advice
- "Before foo(), do this first"
- - "Do this after foo()
+ - "Do this after foo()"
- "Put this code around foo()"
@@ -275,7 +276,7 @@ has weight => (
);
# kaboom
-Person->new( weight => 'fat' );
+Person->new( weight => 'heavy' );
@@ -300,8 +301,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
@@ -842,6 +843,16 @@ has last_name => (
);
+
+
More Why Moose?
+
+
+ - Less code == fewer bugs
+ - Moose is well-tested, test your own code, not Moose
+ - Focus on what, not how
+
+
+
Part 1: Moose Classes
@@ -882,8 +893,8 @@ use Moose;
BUILDARGS
- - Takes
@_
, returns a hash reference of attribute names/value
- - Accepts a hash or hashref; throws otherwise
+ - Processes
new
's @_
, returns a hash reference of attribute name/value pairs
+ - Accepts a hash or hashref; errors otherwise
- Provide your own for other cases
- Always call
$class->SUPER::BUILDARGS(@_)
as a fallback!
@@ -939,13 +950,13 @@ sub BUILD {
Object Construction a la Moose
-
Person->new(@_)
+
Person->new(@args)
-
- - Calls
Person->BUILDARGS(@_)
to turn @_
into a hashref
+
+ - Calls
Person->BUILDARGS(@args)
to turn @args
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
@@ -957,6 +968,7 @@ sub BUILD {
- Technically it's a hash reference
- If you ever treat it as one you are doing it wrong!
+ - Moose probably provides a feature to do what you need
@@ -966,6 +978,7 @@ sub BUILD {
- Like
DESTROY
, but Moose makes sure all DEMOLISH
methods in a hierarchy are called
- Called in normal inheritance order, children to parents
+ - Never called by you, only by Perl itself
@@ -1019,7 +1032,7 @@ extends 'LWP';
No DEMOLISH()
- But see MooseX::NonMoose
for a workaround
+ But MooseX::NonMoose
fixes all of this
@@ -1029,6 +1042,7 @@ extends 'LWP';
override
is another method modifier
- An alternative to Perl's
SUPER::
+ - Declares your intent to override a method
@@ -1040,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();
+};
@@ -1055,7 +1069,8 @@ use Moose;
- Mostly like
$self->SUPER::work(@_)
- But cannot change
@_
!
- - Binds the parent's method at compile time
+ - Binds the parent's method correctly at compile time
+ - Parent determined by checking
Child->meta()->superclasses()
@@ -1096,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
@@ -1116,7 +1130,7 @@ print $person->first_name; # Dave
use Moose;
# true
-Person->can('extends');
+Person->can('extends');
- Not very hygienic
@@ -1131,17 +1145,31 @@ use Moose;
...
-no Moose;
+no Moose;
+
+# false
+Person->can('extends');
+
+
+
+
Cleaning Up Moose Droppings
+
+
package Person;
+use Moose;
+use namespace::autoclean;
+
+...
# 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
@@ -1151,13 +1179,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;
@@ -1206,7 +1234,7 @@ use Moose;
# perl bin/prove -lv t/00-prereq.t
-# perl install-moose (if needed)
+## Read the instructions in t/01-classes.t
# perl bin/prove -lv t/01-classes.t
@@ -1279,23 +1307,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();
@@ -1312,7 +1342,9 @@ print $person->full_name
package Person;
use Moose;
-with 'Printable';
+
with 'Printable';
+
+sub as_string { $_[0]->first_name() }
@@ -1323,6 +1355,8 @@ use Moose;
with 'Printable';
+sub as_string { $_[0]->first_name() }
+
has has_been_printed => ( is => 'rw' );
sub print {
@@ -1343,7 +1377,7 @@ sub print {
# or ...
-Person->meta->does('Printable')
+Person->meta->does_role('Printable')
@@ -1403,69 +1437,17 @@ use Moose;
-
Method Aliasing
-
-
package FragileDancer;
-use Moose;
-
-with 'IsFragile' =>
- { -alias =>
- { break => 'break_bone' } },
- 'CanBreakdance' =>
- { -alias =>
- { break => 'break_it_down' } };
-
-
- - Renames the roles' methods
- - Still conflicts, need to
exclude
as well
-
-
-
-
-
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
- - Roles are also about semantics!
- - We've fulfilled the letter and lost the spirit
+ - Roles are about semantics!
- Roles have a meaning
- - Think twice before blindly aliasing and excluding methods!
+ - Method name conflicts smell like bad design
-
Hot Role-on-Role Action
+
Roles With Roles
package Comparable;
use Moose::Role;
@@ -1474,7 +1456,7 @@ requires 'compare';
-
Hot Role-on-Role Action
+
Roles With Roles
package TestsEquality;
use Moose::Role;
@@ -1483,7 +1465,7 @@ with 'Comparable';
sub is_equal {
my $self = shift;
- return $self->compare(@_) == 0;
+ return $self->compare(@_) == 0;
}
@@ -1498,36 +1480,8 @@ with 'TestsEquality';
# Satisfies the Comparable role
sub compare { ... }
-Integer->does('TestsEquality'); # true
-Integer->does('Comparable'); # also true!
-
-
-
-
Name Conflicts Between Roles
-
-
package HasSubProcess;
-use Moose::Role;
-
-sub execute { ... }
-
-package Killer;
-use Moose::Role;
-
-with 'HasSubProcess';
-
-sub execute { ... }
-
-
-
-
Delayed Conflict
-
-
package StateOfTexas;
-with 'Killer';
-
-
- StateOfTexas
must implement its own execute
- - But loading the
Killer
role by itself does not cause an error
-
+Integer->does('TestsEquality'); # true
+Integer->does('Comparable'); # also true!
@@ -1553,7 +1507,7 @@ use Moose;
with 'HasSize';
-has size => ( is => 'ro' );
+has size => ( is => 'ro' );
@@ -1567,7 +1521,7 @@ requires 'size';
package Shirt;
use Moose;
-has size => ( is => 'ro' );
+has size => ( is => 'ro' );
with 'HasSize';
@@ -1589,9 +1543,9 @@ with 'HasSize';
package Comparison;
use Moose;
-has [ 'left', 'right' ] => (
- is => 'ro',
- does => 'Comparable',
+has [ 'left', 'right' ] => (
+ is => 'ro',
+ does => 'Comparable',
);
@@ -1606,7 +1560,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' );
@@ -1680,8 +1634,6 @@ requires 'compare';
Real Examples
- - Column and ColumnAlias both do ColumnLike
- - ColumnLike things can be used in certain parts of queries
- All queries do HasWhereClause
- Select does Comparable and Selectable (for subselects)
- A where clause requires its components to do Comparable
@@ -1743,6 +1695,15 @@ has 'is_ripped' => ( is => 'rw' );
+
Read-only vs Read-write
+
+
+ - Read-only is preferred
+ - Minimize state in your application
+
+
+
+
Required-ness
@@ -1762,8 +1723,8 @@ has first_name => (
required => 1,
);
-Person->new( first_name => undef ); # ok
-Person->new(); # kaboom
+Person->new( first_name => undef ); # ok
+Person->new(); # kaboom
@@ -1828,6 +1789,7 @@ use Moose;
has bank => (
is => 'rw',
+ # THIS WILL NOT WORK
default => Bank->new(
name => 'Spire FCU' ),
);
@@ -1850,25 +1812,11 @@ has packages => (
-
What if I Want to Share?
-
-
package Person;
-use Moose;
-
-my $highlander_bank =
- Bank->new( name => 'Spire FCU' );
-
-has bank => (
- is => 'rw',
- default => sub { $highlander_bank },
-);
-
-
-
Builder
- - A method name which returns the default
+ - A method name
+ - When called, this method returns the default value
@@ -1886,7 +1834,7 @@ has bank => (
sub _build_bank {
my $self = shift;
return Bank->new(
- name => 'Spire FCU' );
+ name => 'Spire FCU' );
}
@@ -1942,7 +1890,8 @@ has bank => (
use Moose;
has shoe_size => (
- is => 'ro',
+ is => 'ro',
+ required => 1,
);
@@ -1952,7 +1901,7 @@ has shoe_size => (
has shoes => (
is => 'ro',
lazy => 1,
- builder => '_build_shoes',
+ builder => '_build_shoes',
);
sub _build_shoes {
@@ -2025,16 +1974,16 @@ has account => (
package Person;
use Moose;
-has shoe_size => (
+has shoe_size => (
is => 'ro',
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;
@@ -2043,12 +1992,12 @@ print $person->shoe_size;
package Person;
use Moose;
-has shoes => (
+has shoes => (
is => 'ro',
init_arg => undef,
);
-Person->new( shoes => Shoes->new );
+Person->new(
shoes => Shoes->new );
@@ -2066,16 +2015,8 @@ Person->new(
shoes => Shoes->new );Attribute Inheritance
- - By default, subclasses inherit attribute as-is
- - Can change some attribute parameters in subclasses
-
- - default
- - builder
- - required
- - lazy
- - others we've not yet covered
-
-
+ - By default, subclasses inherit attributes as-is
+ - Can change attribute parameters in subclasses
@@ -2195,6 +2136,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
@@ -2224,18 +2172,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
@@ -2362,7 +2310,7 @@ after clear_password => sub {
$self->$orig(
$self->_munge_insert(@_) );
- $new_user->_assign_uri;
+ $new_user->_assign_uri;
return $new_user;
};
@@ -2421,59 +2369,6 @@ around run => sub {
-
Augment and Inner
-
-
- - Inverted
super
- - From least- to most-specific
- - Grandparent to parent to child
- - Not allowed in roles
-
-
-
-
-
Augment and Inner
-
-
package Document;
-
-sub xml { '<doc>' . inner() . '</doc>' }
-
-package Report;
-extends 'Document';
-augment xml =>
- sub { title() . inner() . summary() };
-
-package TPSReport;
-extends 'Report';
-augment xml =>
- sub { tps_xml() . inner() };
-
-
-
-
Augment and Inner
-
-
- - When we call
$tps->xml
...
-
- Document->xml
- Report->xml
- TPSReport->xml
-
-
-
-
-
-
-
Augment and Inner Usage
-
-
- - Call
inner()
to "fill in the blank"
- - Requires designing for subclassing
- - Call
inner()
in the terminal class, just in case
-
-
-
-
Method Modifiers Summary
@@ -2499,21 +2394,7 @@ extends 'Report';
- not call the original method at all (or call a different method)
-
-
-
-
-
Method Modifiers Summary
-
-
- When using modifiers in a role, require the modified method
- - Use
augment
and inner
to invert the normal subclassing flow ...
-
- - Least- to most-specific (parents to children)
- - Build in "insertability" (stick more stuff in the "middle")
-
-
- - Always call
inner
in the most specific subclass to allow for future extension
@@ -2568,11 +2449,11 @@ Item
Undef
Defined
Value
- Num
- Int
- Str
- ClassName
- RoleName
+ Str
+ Num
+ Int
+ ClassName
+ RoleName
@@ -2590,7 +2471,7 @@ Item
CodeRef
RegexpRef
GlobRef
- FileHandle
+ FileHandle
Object
@@ -2599,15 +2480,12 @@ Item
Bool
True
- 1
-924.1
-'true'
-{}
+ 1
False
0
-0.0
'0'
+''
undef
@@ -2621,6 +2499,7 @@ undef
Value
is true when ! ref $thing
Value
and Str
are effectively the same, but Str
is more expressive
+ Num
is true when a $scalar
looks like a number
- An overloaded object which numifies does not pass the
Num
constraint!
- Perl 5's overloading is hopelessly broken
@@ -2721,9 +2600,15 @@ has start_date => (
Subtype Shortcuts - class_type
use Moose::Util::TypeConstraints;
+
class_type 'DateTime';
-subtype 'DateTime',
+
+
+
+
+
+subtype 'DateTime',
as 'Object',
where { $_->isa('DateTime') },
message { ... };
@@ -2733,10 +2618,16 @@ subtype 'DateTime',
Subtype Shortcuts - role_type
use Moose::Util::TypeConstraints;
+
role_type 'Printable';
+
+
+
+
+
subtype 'Printable',
- as 'Object',
+ as 'Object',
where
{ Moose::Util::does_role(
$_, 'Printable' ) },
@@ -2747,8 +2638,14 @@ subtype 'Printable',
Subtype Shortcuts - duck_type
use Moose::Util::TypeConstraints;
+
duck_type Car => qw( run break_down );
+
+
+
+
+
subtype 'Car',
as 'Object',
where { all { $_->can($_) }
@@ -2760,12 +2657,18 @@ 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 }
qw( red blue green );
-subtype 'Color'
+subtype 'Color'
as 'Str',
where { $ok{$_} },
message { ... };
@@ -2777,7 +2680,9 @@ subtype 'Color'
package Person;
my $posint =
- subtype as 'Int', where { $_ > 0 };
+ subtype
+ as 'Int',
+ where { $_ > 0 };
has size => (
is => 'ro',
@@ -2836,7 +2741,8 @@ coerce 'My::DateTime',
Coercion Examples
-
coerce 'ArrayRef[Int]',
+ # BAD CODE - DO NOT COPY
+coerce 'ArrayRef[Int]',
from 'Int',
via { [ $_ ] };
@@ -2881,6 +2787,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;
@@ -2921,7 +2840,7 @@ sub work {
Digression: The Type Registry
- - Types are actually
Moose::Meta::TypeConstraints
objects
+ - Types are actually
Moose::Meta::TypeConstraint
objects
- Stored in an interpreter-global registry mapping names to objects
@@ -3011,9 +2930,9 @@ coerce ArrayOfInt
use MyApp::Types qw( ArrayOfInt );
-has transaction_history => (
- is => 'rw',
- isa => ArrayOfInt,
+has transaction_history => (
+ is => 'rw',
+ isa => ArrayOfInt,
);
@@ -3023,7 +2942,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']
@@ -3036,17 +2955,28 @@ 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
+
Specio
+
+
+ - My attempt to replace
MooseX::Types
and built-in types
+ - Third-system effect?
+ - Still alpha - needs some work
+
+
+
+
Recommendation
- - Use
MooseX::Types
+ - Use
MooseX::Types
for now
+ - Switch to
Specio
when it's ready?
- Compile time error catching and automatic namespacing are huge wins
- Docs from
Moose::Util::TypeConstraints
are 98% compatible with MooseX::Types
anyway
- A function exported by a type library works wherever a type name would
@@ -3057,15 +2987,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
@@ -3163,7 +3084,7 @@ $alice->friend($bob);
after salary_level => {
my $self = shift;
- return unless @_;
+ return unless @_;
$self->clear_salary;
};
@@ -3175,11 +3096,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
@@ -3195,7 +3127,7 @@ $alice->friend($bob);
has lungs => (
is => 'ro',
- isa => 'Lungs',
+ isa => 'Lungs',
handles => [ 'inhale', 'exhale' ],
);
@@ -3236,6 +3168,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
@@ -3268,8 +3201,12 @@ has account => (
},
- $person->receive_money
= $person->account->deposit
- $person->give_money
= $person->account->withdraw
+ $person->receive_money
+
+ = $person->account->deposit
+ $person->give_money
+
+ = $person->account->withdraw
@@ -3358,7 +3295,6 @@ has history => (
use Moose;
has _favorite_numbers => (
traits => [ 'Array' ],
- is => 'ro',
isa => 'ArrayRef[Int]',
default => sub { [] },
init_arg => undef,
@@ -3396,7 +3332,7 @@ print "$_\n"
Bool - set
, toggle
, ...
Hash - get
, set
, ...
Array - already saw it
- Code - execute
, that's it
+ Code - execute
and execute_method
@@ -3421,7 +3357,7 @@ has account => (
isa => 'BankAccount',
handles => {
receive_100 =>
- [ 'deposit', 100 ]
+ [ 'deposit', 100 ],
give_100 =>
[ 'withdraw', 100 ]
},
@@ -3437,89 +3373,13 @@ $person->account->deposit(100);
-
Traits and Metaclasses
-
-
- - The ultimate in customization
- - Per attribute metaclasses
- - Per attribute roles applied to the attribute metaclass
- - Change the meta-level behavior
-
-
-
-
-
Traits and Metaclasses
-
-
- - The default metaclass is
Moose::Meta::Attribute
- - Controls accessor generation, defaults, delegation, etc.
- - Adding a role to this metaclass (or replacing it) allows for infinite customization
-
-
-
-
-
Traits and Metaclasses
-
-
- - Can add/alter/remove attribute parameter (from
has
)
- - Can change behavior of created attribute
-
-
-
-
-
Simple Trait Example
-
-
package Person;
-use Moose;
-use MooseX::LabeledAttributes;
-
-has ssn => (
- traits => [ 'Labeled' ],
- is => 'ro',
- isa => 'Str',
- label => 'Social Security Number',
-);
-print Person->meta
- ->get_attribute('ssn')->label;
-
-
-
-
Simple Metaclass Example
-
-
package Person;
-use Moose;
-use MooseX::LabeledAttributes;
-
-has ssn => (
- metaclass =>
- 'MooseX::Meta::Attribute::Labeled',
- is => 'ro',
- isa => 'Str',
- label => 'Social Security Number',
-);
-print Person->meta
- ->get_attribute('ssn')->label;
-
-
-
-
Traits vs Metaclass
-
-
- - Can apply any mix of traits to an attribute
- - But just one metaclass
- - Traits (aka roles) can cooperate
- - Metaclasses require you to pick just one
-
-
-
-
Advanced Attributes Summary
- Use
weak_ref
to avoid circular references
- Use trigger to do an action post-attribute write
- Use delegations to hide "internal" objects
- - Traits and metaclasses let you extend Moose's core attribute features
+ - Use native delegations to treat Perl types as objects
@@ -3537,12 +3397,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
@@ -3550,7 +3418,7 @@ Iterate til this passes all its tests
- Not comprehensive
- - 128 MooseX distributions on CPAN as of 09/24/2009
+ - 188 MooseX distributions on CPAN as of 02/03/2011
- Some of them are crap
@@ -3559,11 +3427,11 @@ Iterate til this passes all its tests
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::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
@@ -3571,11 +3439,11 @@ Iterate til this passes all its tests
MooseX::Declare
use MooseX::Declare;
-use 5.10.0; # for say
+use 5.12.0; # for say
class Person {
- has greeting
- => ( is => 'ro', isa => 'Str' );
+ has greeting =>
+ ( is => 'ro', isa => 'Str' );
method speak {
say $self->greeting;
@@ -3590,6 +3458,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?)
@@ -3597,7 +3466,7 @@ class Person {
MooseX::StrictConstructor
- - By default, unknown constructor arguments are ignore
+ - By default, unknown constructor arguments are ignored
- MX::StrictConstructor turns these into an error
@@ -3659,7 +3528,7 @@ use Moose;
has file =>
( is => 'ro', required => 1 );
has filters =>
- ( is => 'ro', isa => 'Str' );
+ ( is => 'ro', isa => 'ArrayRef[Str]' );
sub run { ... }
@@ -3675,7 +3544,7 @@ sub run { ... }
use App::CLI;
-App::CLI->new_with_options()->run();
+App::CLI->new_with_options()->run();
$ myapp-cli \
--file foo \
@@ -3735,12 +3604,22 @@ with HasCollection => { type => 'Int' };
Questions?
-
-
Part 9: Writing Moose Extensions
-
+
+
Moose-using Modules
-
-
The End
+
+ For further reading, a few modules which use Moose ...
+
+
+
@@ -3748,22 +3627,26 @@ with HasCollection => { type => 'Int' };
+
+
The End
+
+