## 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;
# 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()';
}