2 package Moose::Meta::Method::Destructor;
7 use Scalar::Util 'blessed', 'weaken';
9 our $VERSION = '0.89_02';
10 $VERSION = eval $VERSION;
11 our $AUTHORITY = 'cpan:STEVAN';
13 use base 'Moose::Meta::Method',
14 'Class::MOP::Method::Inlined';
20 (ref $options{options} eq 'HASH')
21 || $class->throw_error("You must pass a hash of options", data => $options{options});
23 ($options{package_name} && $options{name})
24 || $class->throw_error("You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT");
29 'package_name' => $options{package_name},
30 'name' => $options{name},
32 'options' => $options{options},
33 'associated_metaclass' => $options{metaclass},
36 # we don't want this creating
37 # a cycle in the code, if not
39 weaken($self->{'associated_metaclass'});
41 $self->_initialize_body;
48 sub options { (shift)->{'options'} }
54 my $metaclass = shift;
56 ( blessed $metaclass && $metaclass->isa('Class::MOP::Class') )
57 || $self->throw_error(
58 "The is_needed method expected a metaclass object as its arugment");
60 return $metaclass->find_method_by_name("DEMOLISHALL");
64 Carp::cluck('The initialize_body method has been made private.'
65 . " The public version is deprecated and will be removed in a future release.\n");
66 shift->_initialize_body;
69 sub _initialize_body {
72 # the %options should also include a both
73 # a call 'initializer' and call 'SUPER::'
74 # options, which should cover approx 90%
75 # of the possible use cases (even if it
76 # requires some adaption on the part of
77 # the author, after all, nothing is free)
79 my @DEMOLISH_methods = $self->associated_metaclass->find_all_methods_by_name('DEMOLISH');
82 if ( @DEMOLISH_methods ) {
84 $source .= 'local ( $., $@, $!, $^E, $? );' . "\n";
87 foreach my $method (@DEMOLISH_methods) {
88 push @DEMOLISH_calls => '$_[0]->' . $method->{class} . '::DEMOLISH()';
91 $source .= join ";\n" => @DEMOLISH_calls;
93 $source .= ";\n" . '}';
98 warn $source if $self->options->{debug};
100 my ( $code, $e ) = $self->_compile_code(
106 "Could not eval the destructor :\n\n$source\n\nbecause :\n\n$e",
107 error => $e, data => $source )
110 $self->{'body'} = $code;
122 Moose::Meta::Method::Destructor - Method Meta Object for destructors
126 This class is a subclass of L<Class::MOP::Class::Generated> that
127 provides Moose-specific functionality for inlining destructors.
129 To understand this class, you should read the the
130 L<Class::MOP::Class::Generated> documentation as well.
134 C<Moose::Meta::Method::Destructor> is a subclass of
135 L<Moose::Meta::Method> I<and> L<Class::MOP::Method::Generated>.
141 =item B<< Moose::Meta;:Method::Destructor->new(%options) >>
143 This constructs a new object. It accepts the following options:
149 The package for the class in which the destructor is being
150 inlined. This option is required.
154 The name of the destructor method. This option is required.
158 The metaclass for the class this destructor belongs to. This is
159 optional, as it can be set later by calling C<<
160 $metamethod->attach_to_class >>.
164 =item B<< Moose::Meta;:Method::Destructor->is_needed($metaclass) >>
166 Given a L<Moose::Meta::Class> object, this method returns a boolean
167 indicating whether the class needs a destructor. If the class or any
168 of its parents defines a C<DEMOLISH> method, it needs a destructor.
174 Stevan Little E<lt>stevan@iinteractive.comE<gt>
176 =head1 COPYRIGHT AND LICENSE
178 Copyright 2006-2009 by Infinity Interactive, Inc.
180 L<http://www.iinteractive.com>
182 This library is free software; you can redistribute it and/or modify
183 it under the same terms as Perl itself.