From: Stevan Little Date: Wed, 28 May 2008 03:17:14 +0000 (+0000) Subject: fixing the destructor, so it doesnt need to be created X-Git-Tag: 0_55~133 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=9d22affbd665b47a3b5a87feb223b81edb233539;p=gitmo%2FMoose.git fixing the destructor, so it doesnt need to be created --- diff --git a/lib/Moose/Meta/Method/Destructor.pm b/lib/Moose/Meta/Method/Destructor.pm index 3e1f7c8..e85070d 100644 --- a/lib/Moose/Meta/Method/Destructor.pm +++ b/lib/Moose/Meta/Method/Destructor.pm @@ -50,7 +50,17 @@ sub associated_metaclass { (shift)->{'$!associated_metaclass'} } ## method -sub is_needed { defined $_[0]->{'&!body'} ? 1 : 0 } +sub is_needed { + my $self = shift; + # if called as a class method + # then must pass in a class name + unless (blessed $self) { + (blessed $_[0] && $_[0]->isa('Class::MOP::Class')) + || confess "When calling is_needed as a class method you must pass a class name"; + return $_[0]->meta->can('DEMOLISH'); + } + defined $self->{'&!body'} ? 1 : 0 +} sub initialize_body { my $self = shift; @@ -61,10 +71,15 @@ sub initialize_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()'; }