document TC change
[gitmo/Moose.git] / lib / Moose / Unsweetened.pod
index 4799be4..381723f 100644 (file)
@@ -41,8 +41,10 @@ First, we define two very small classes the Moose way.
       => via { $en_parser->parse_datetime($_) };
 
   has birth_date => (
-      is  => 'rw',
-      isa => 'DateTime',
+      is      => 'rw',
+      isa     => 'DateTime',
+      coerce  => 1,
+      handles => { birth_year => 'year' },
   );
 
   subtype 'ShirtSize'
@@ -106,18 +108,15 @@ helpers like C<Class::Accessor>.
       exists $p{birth_date}
           or confess 'birth_date is a required attribute';
 
-      $p{birth_date} = $class->_coerce_birth_date($date );
-      $class->_validate_birth_date( $date );
+      $p{birth_date} = $class->_coerce_birth_date( $p{birth_date} );
+      $class->_validate_birth_date( $p{birth_date} );
 
       $p{shirt_size} = 'l'
           unless exists $p{shirt_size}:
 
       $class->_validate_shirt_size( $p{shirt_size} );
 
-      my %self = map { $_ => $p{$_} } qw( name shirt_size );
-      $self{birth_date} = $date;
-
-      return bless \%self, $class;
+      return bless \%p, $class;
   }
 
   sub _validate_name {
@@ -154,7 +153,7 @@ helpers like C<Class::Accessor>.
 
       local $Carp::CarpLevel = $Carp::CarpLevel + 1;
 
-      $birth_date->isa('DateTime') )
+      $birth_date->isa('DateTime')
           or confess 'birth_date must be a DateTime object';
   }
 
@@ -195,6 +194,12 @@ helpers like C<Class::Accessor>.
       return $self->{birth_date};
   }
 
+  sub birth_year {
+      my $self = shift;
+
+      return $self->birth_date->year;
+  }
+
   sub shirt_size {
       my $self = shift;
 
@@ -208,28 +213,23 @@ helpers like C<Class::Accessor>.
 
 Wow, that was a mouthful! One thing to note is just how much space the
 data validation code consumes. As a result, it's pretty common for
-Perl 5 programmers to just not bother, which results in much more
-fragile code.
+Perl 5 programmers to just not bother. Unfortunately, not validating
+arguments leads to surprises down the line ("why is birth_date an
+email address?").
 
-Did you spot the (intentional) bug?
+Also, did you spot the (intentional) bug?
 
 It's in the C<_validate_birth_date()> method. We should check that
-that value in C<$birth_date> is actually defined and object before we
-go and call C<isa()> on it! Leaving out those checks means our data
+the value in C<$birth_date> is actually defined and an object before
+we go and call C<isa()> on it! Leaving out those checks means our data
 validation code could actually cause our program to die. Oops.
 
-There's one bit of code in there worth explaining, which is the
-handling of the birth date for coercion. In both the constructor and
-accessor, we first take a copy of the birth date before passing it to
-the coercion routine. This is to avoid changing the value as it was
-passed to those methods, which could cause problems for the caller.
-
-Also note that if we add a superclass to Person we'll have to change
-the constructor to account for that.
+Note that if we add a superclass to Person we'll have to change the
+constructor to account for that.
 
 (As an aside, getting all the little details of what Moose does for
-you just right in this code was not easy, which just emphasizes the
-point, that Moose saves you a lot of work!)
+you just right in this example was really not easy, which emphasizes
+the point of the example. Moose saves you a lot of work!)
 
 Now let's see User:
 
@@ -318,13 +318,17 @@ sugar, nor are these other modules designed for extensibility in the
 same way as Moose. With Moose, it's easy to write a MooseX module to
 replace or extend a piece of built-in functionality.
 
+Moose is a complete OO package in and of itself, and is part of a rich
+ecosystem of extensions. It also has an enthusiastic community of
+users, and is being actively maintained and developed.
+
 =head1 AUTHOR
 
 Dave Rolsky E<lt>autarch@urth.orgE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2008 by Infinity Interactive, Inc.
+Copyright 2009 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>