X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FManual%2FConstruction.pod;h=60e7cfb296e9e719bfc043fe3954f5c0a5ed4fcc;hb=53b4c6974f25037ea6ce937cc5ff715e7a7aca0f;hp=9f35a9df03df6b5b8ab0ed39ef4ef89c7d589152;hpb=d67ce58f8d57e240ded1f1ebdf262456ce2ff5be;p=gitmo%2FMoose.git diff --git a/lib/Moose/Manual/Construction.pod b/lib/Moose/Manual/Construction.pod index 9f35a9d..60e7cfb 100644 --- a/lib/Moose/Manual/Construction.pod +++ b/lib/Moose/Manual/Construction.pod @@ -6,7 +6,7 @@ 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 L, which provides a C method for you. If you @@ -50,28 +50,29 @@ Without a C method, Moose will complain, because it expects a hash or hash reference. We can use the C method to 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 +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 -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. +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,6 +92,13 @@ object creation. debug( 'Made a new person - SSN = ', $self->ssn, ); } +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 @@ -104,7 +112,8 @@ normal order of method inheritance. The theory behind this is that C 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 @@ -114,9 +123,29 @@ $self->SUPER::DEMOLISH >>. Moose will arrange for all of the C methods in your hierarchy to be called, from most to least specific. +Each C method is called with a single argument. + In most cases, Perl's built-in garbage collection is sufficient, and you won't need to provide a C method. +=head2 Error Handling During Destruction + +The interaction of object destruction and Perl's global C<$@> and C<$?> +variables can be very confusing. + +Moose always localizes C<$?> when an object is being destroyed. This means +that if you explicitly call C, that exit code will be preserved even if +an object's destructor makes a system call. + +Moose also preserves C<$@> against any C calls that may happen during +object destruction. However, if an object's C method actually dies, +Moose explicitly rethrows that error. + +If you do not like this behavior, you will have to provide your own C +method and use that instead of the one provided by L. You can +do this to preserve C<$@> I capture any errors from object destruction by +creating an error stack. + =head1 AUTHOR Dave Rolsky Eautarch@urth.orgE