X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FDestructor.pm;h=d8f21a2ee6b93f303458f9980a802b0e8a9cbf98;hb=5f43e0cffb2643c6e8a0624b309a0896e820e7ad;hp=df95187a923bfa7d0b5c139b935d9c132a0adb43;hpb=d44714be2bf834a2df5e42da05fb7a760145adf8;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Destructor.pm b/lib/Moose/Meta/Method/Destructor.pm index df95187..d8f21a2 100644 --- a/lib/Moose/Meta/Method/Destructor.pm +++ b/lib/Moose/Meta/Method/Destructor.pm @@ -4,49 +4,64 @@ package Moose::Meta::Method::Destructor; use strict; use warnings; -use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; -our $VERSION = '0.01'; +our $VERSION = '0.72'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; -use base 'Moose::Meta::Method'; +use base 'Moose::Meta::Method', + 'Class::MOP::Method::Generated'; sub new { my $class = shift; my %options = @_; - (exists $options{options} && ref $options{options} eq 'HASH') - || confess "You must pass a hash of options"; - + (ref $options{options} eq 'HASH') + || $class->throw_error("You must pass a hash of options", data => $options{options}); + + ($options{package_name} && $options{name}) + || $class->throw_error("You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT"); + my $self = bless { # from our superclass - '&!body' => undef, + 'body' => undef, + 'package_name' => $options{package_name}, + 'name' => $options{name}, # ... - '%!options' => $options{options}, - '$!associated_metaclass' => $options{metaclass}, + 'options' => $options{options}, + 'associated_metaclass' => $options{metaclass}, } => $class; # we don't want this creating # a cycle in the code, if not # needed - weaken($self->{'$!associated_metaclass'}); + weaken($self->{'associated_metaclass'}); - $self->intialize_body; + $self->initialize_body; return $self; } ## accessors -sub options { (shift)->{'%!options'} } -sub associated_metaclass { (shift)->{'$!associated_metaclass'} } +sub options { (shift)->{'options'} } +sub associated_metaclass { (shift)->{'associated_metaclass'} } ## method -sub is_needed { defined $_[0]->{'&!body'} ? 1 : 0 } +sub is_needed { + my $self = shift; + my $metaclass = shift; + + ( blessed $metaclass && $metaclass->isa('Class::MOP::Class') ) + || $self->throw_error( + "The is_needed method expected a metaclass object as its arugment"); + + return $metaclass->meta->can('DEMOLISH'); +} -sub intialize_body { +sub initialize_body { my $self = shift; # TODO: # the %options should also include a both @@ -55,24 +70,29 @@ sub intialize_body { # of the possible use cases (even if it # requires some adaption on the part of # the author, after all, nothing is free) + + my @DEMOLISH_methods = $self->associated_metaclass->find_all_methods_by_name('DEMOLISH'); + + return unless @DEMOLISH_methods; + my $source = 'sub {'; my @DEMOLISH_calls; - foreach my $method ($self->associated_metaclass->find_all_methods_by_name('DEMOLISH')) { + foreach my $method (@DEMOLISH_methods) { push @DEMOLISH_calls => '$_[0]->' . $method->{class} . '::DEMOLISH()'; } - $source .= join "\n" => @DEMOLISH_calls; + $source .= join ";\n" => @DEMOLISH_calls; $source .= ";\n" . '}'; warn $source if $self->options->{debug}; - my $code; - { - $code = eval $source; - confess "Could not eval the destructor :\n\n$source\n\nbecause :\n\n$@" if $@; - } - $self->{'&!body'} = $code; + my $code = $self->_compile_code( + environment => {}, + code => $source, + ) or $self->throw_error("Could not eval the destructor :\n\n$source\n\nbecause :\n\n$@", error => $@, data => $source); + + $self->{'body'} = $code; } @@ -89,7 +109,7 @@ Moose::Meta::Method::Destructor - Method Meta Object for destructors =head1 DESCRIPTION This is a subclass of L which handles -constructing an approprate Destructor method. This is primarily +constructing an appropriate Destructor method. This is primarily used in the making of immutable metaclasses, otherwise it is not particularly useful. @@ -107,7 +127,7 @@ not particularly useful. =item B -=item B +=item B =item B @@ -119,7 +139,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006, 2007 by Infinity Interactive, Inc. +Copyright 2006-2009 by Infinity Interactive, Inc. L