X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FManual%2FConstruction.pod;h=be2d3e2b1a774ea35165bdd721bdaaadfd4be397;hb=c24269b37a781e0358c3682e8717cfd539269550;hp=d71fb6b9ecbbbffeef707aaa16b5488e7b53dfac;hpb=62225ecf2316a8565533d1470658234ca86468ba;p=gitmo%2FMoose.git diff --git a/lib/Moose/Manual/Construction.pod b/lib/Moose/Manual/Construction.pod index d71fb6b..be2d3e2 100644 --- a/lib/Moose/Manual/Construction.pod +++ b/lib/Moose/Manual/Construction.pod @@ -2,17 +2,17 @@ =head1 NAME -Moose::Manual::Classes - Object construction (and destruction) with Moose +Moose::Manual::Construction - Object construction (and destruction) with Moose =head1 WHERE'S THE CONSTRUCTOR? -B method for your classes!> +B method for your classes!> When you C in your class, you will become a subclass of -C, which provides a C method for you. And if you +L, which provides a C method for you. If you follow our recommendations in L and make your class immutable, then you actually get a class-specific C -method genreated in your class. +method "inlined" in your class. =head1 OBJECT CONSTRUCTION AND ATTRIBUTES @@ -24,54 +24,55 @@ you're ready to start creating objects! =head1 OBJECT CONSTRUCTION HOOKS -Sometimes you need to hook into object construction. Some common needs -are validating an object's state, logging, and allowing non-hash(ref) -constructor arguments. Moose provides hooks for these needs with the -C and C methods. +Moose lets you hook into object construction. You can validate an +object's state, do logging, or maybe allow non-hash(ref) constructor +arguments. You can do this by creating C and/or C +methods. -If these are defined in your class, then Moose will arrange for them -to be called as part of the object construction process. +If these methods exist in your class, Moose will arrange for them to +be called as part of the object construction process. =head2 BUILDARGS -The C method is called I an object is created, and -is therefore called as a class method. It will receive all of the -arguments that were passed to C I. Your C -method must then return a hash reference. This hash reference will be -used to construct the object, so it should contain keys matching your -attributes' names (well, Cs). +The C method is called as a class method I an +object is created. It will receive all of the arguments that were +passed to C I, and is expected to return a hash +reference. This hash reference will be used to construct the object, +so it should contain keys matching your attributes' names (well, +Cs). -One common use for C is to accomodate a non-hash(ref) +One common use for C is to accommodate a non-hash(ref) calling style. For example, we might want to allow our Person class to be called with a single argument of a social security number, C<< Person->new($ssn) >>. Without a C method, Moose will complain, because it expects a hash or hash reference. We can use the C method to -accomodate this calling style: +accommodate this calling style: - sub BUILDARGS { + around BUILDARGS => sub { + my $orig = shift; my $class = shift; if ( @_ == 1 && ! ref $_[0] ) { - return { ssn => $_[0] }; + return $class->$orig(ssn => $_[0]); } else { - return $class->SUPER::BUILDARGS(@_); + return $class->$orig(@_); } - } + }; -Note the call to C. This will call the default -C in C. This method handles distinguishing -between a hash reference and a plain hash, so you don't have to. +Note the call to C<< $class->$orig >>. This will call the default +C in L. This method handles distinguishing +between a hash reference and a plain hash for you. =head2 BUILD The C method is called I an object is created. There are -many potential uses for a C method. One of the most common is -to check that the object state makes sense. While we can validate -individual attributes through the use of types, we can't validate the -state of a whole object that way. +several ways to use a C method. One of the most common is to +check that the object state is valid. While we can validate individual +attributes through the use of types, we can't validate the state of a +whole object that way. sub BUILD { my $self = shift; @@ -91,7 +92,14 @@ object creation. debug( 'Made a new person - SSN = ', $self->ssn, ); } -=head3 BUILD and Parent Classes +Note that while it is not shown here, the C method receives +not only the created object, but also a hashref of the original +arguments passed to new (or the results of your C, +if you have overridden the default C.) This can be +useful if you need to venture beyond what the default +initialization behavior and coercions can accomplish. + +=head3 BUILD and parent classes The interaction between multiple C methods in an inheritance hierarchy is different from normal Perl methods. B methods can only be used for increasing specialization of a class's constraints, so it makes sense -to call the least specific first (also, this is how Perl 6 does it). +to call the least specific C method first. Also, this is how +Perl 6 does it. =head1 OBJECT DESTRUCTION @@ -115,7 +124,7 @@ C methods in your hierarchy to be called, from most to least specific. In most cases, Perl's built-in garbage collection is sufficient, and -you won't need ot provide a C method. +you won't need to provide a C method. =head1 AUTHOR @@ -123,7 +132,7 @@ Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE -Copyright 2008 by Infinity Interactive, Inc. +Copyright 2009 by Infinity Interactive, Inc. L