X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FCookbook%2FBasics%2FRecipe4.pod;h=f5fd5976a1d3e2360191e97f42e3067f6f572b9b;hb=49c4d7468795378b66df85894e8e2bf8e27ca02c;hp=6e150f57b1ca3e39731390fb2964765f5b7468d8;hpb=c79239a22fc3b30cac35dec0d704c7da52872aa5;p=gitmo%2FMoose.git diff --git a/lib/Moose/Cookbook/Basics/Recipe4.pod b/lib/Moose/Cookbook/Basics/Recipe4.pod index 6e150f5..f5fd597 100644 --- a/lib/Moose/Cookbook/Basics/Recipe4.pod +++ b/lib/Moose/Cookbook/Basics/Recipe4.pod @@ -1,7 +1,7 @@ =pod -=begin testing SETUP +=begin testing-SETUP BEGIN { eval 'use Regexp::Common; use Locale::US;'; @@ -12,7 +12,7 @@ BEGIN { } } -=end testing +=end testing-SETUP =head1 NAME @@ -56,19 +56,15 @@ Moose::Cookbook::Basics::Recipe4 - Subtypes, and modeling a simple B cl sub BUILD { my ( $self, $params ) = @_; - if ( @{ $self->employees || [] } ) { - foreach my $employee ( @{ $self->employees } ) { - $employee->employer($self); - } + foreach my $employee ( @{ $self->employees || [] } ) { + $employee->employer($self); } } after 'employees' => sub { my ( $self, $employees ) = @_; - if ($employees) { - foreach my $employee ( @{$employees} ) { - $employee->employer($self); - } + foreach my $employee ( @{ $employees || [] } ) { + $employee->employer($self); } }; @@ -114,12 +110,12 @@ declaratively create type constraints without building an entire class. In the recipe we also make use of L and L -to build constraints, showing how how constraints can make use of -existing CPAN tools for data validation. +to build constraints, showing how constraints can make use of existing +CPAN tools for data validation. Finally, we introduce the C attribute option. -The the C
class we define two subtypes. The first uses the +In the C
class we define two subtypes. The first uses the L module to check the validity of a state. It accepts either a state abbreviation of full name. @@ -188,7 +184,7 @@ where each element of the array is an C object. It's worth noting that an I array reference also satisfies this constraint. -Parameterizable type constraints (or "container types), such as +Parameterizable type constraints (or "container types"), such as C, can be made more specific with a type parameter. In fact, we can arbitrarily nest these types, producing something like C. However, you can also just use the type by @@ -213,17 +209,15 @@ C attribute: sub BUILD { my ( $self, $params ) = @_; - if ( $self->employees ) { - foreach my $employee ( @{ $self->employees } ) { - $employee->employer($self); - } + foreach my $employee ( @{ $self->employees || [] } ) { + $employee->employer($self); } } -The C method is executed after type constraints are checked, so -it is safe to assume that C<< $self->employees >> will return an array -reference, and that the elements of that array will be C -objects. +The C method is executed after type constraints are checked, so it is +safe to assume that if C<< $self->employees >> has a value, it will be an +array reference, and that the elements of that array reference will be +C objects. We also want to make sure that whenever the C attribute for a C is changed, we also update the C for each @@ -233,18 +227,16 @@ To do this we can use an C modifier: after 'employees' => sub { my ( $self, $employees ) = @_; - if ($employees) { - foreach my $employee ( @{$employees} ) { - $employee->employer($self); - } + foreach my $employee ( @{ $employees || [] } ) { + $employee->employer($self); } }; -Again, as with the C method, we know that the type constraint -check has already happened, so we can just check for definedness on the -C<$employees> argument. +Again, as with the C method, we know that the type constraint check has +already happened, so we know that if C<$employees> is defined it will contain +an array reference of C objects.. -The B class does have demonstrate anything new. It has several +The B class does not really demonstrate anything new. It has several C attributes. It also has a C method, which we first used in L. @@ -309,7 +301,7 @@ Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2009 by Infinity Interactive, Inc. +Copyright 2006-2010 by Infinity Interactive, Inc. L