| File | /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Moose/Meta/Method/Destructor.pm |
| Statements Executed | 44 |
| Statement Execution Time | 734µs |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 162µs | 350µs | Moose::Meta::Method::Destructor::new |
| 1 | 1 | 1 | 31µs | 35µs | Moose::Meta::Method::Destructor::BEGIN@4 |
| 1 | 1 | 1 | 29µs | 187µs | Moose::Meta::Method::Destructor::_initialize_body |
| 1 | 1 | 1 | 11µs | 131µs | Moose::Meta::Method::Destructor::is_needed |
| 1 | 1 | 1 | 9µs | 20µs | Moose::Meta::Method::Destructor::BEGIN@5 |
| 1 | 1 | 1 | 7µs | 78µs | Moose::Meta::Method::Destructor::BEGIN@15 |
| 1 | 1 | 1 | 6µs | 34µs | Moose::Meta::Method::Destructor::BEGIN@8 |
| 1 | 1 | 1 | 3µs | 3µs | Moose::Meta::Method::Destructor::BEGIN@7 |
| 1 | 1 | 1 | 3µs | 3µs | Moose::Meta::Method::Destructor::BEGIN@9 |
| 1 | 1 | 1 | 2µs | 2µs | Moose::Meta::Method::Destructor::options |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Method::Destructor::initialize_body |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | |||||
| 2 | package Moose::Meta::Method::Destructor; | ||||
| 3 | |||||
| 4 | 3 | 37µs | 2 | 39µs | # spent 35µs (31+4) within Moose::Meta::Method::Destructor::BEGIN@4 which was called
# once (31µs+4µs) by Moose::Meta::Class::BEGIN@23 at line 4 # spent 35µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@4
# spent 4µs making 1 call to strict::import |
| 5 | 3 | 21µs | 2 | 30µs | # spent 20µs (9+10) within Moose::Meta::Method::Destructor::BEGIN@5 which was called
# once (9µs+10µs) by Moose::Meta::Class::BEGIN@23 at line 5 # spent 20µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@5
# spent 10µs making 1 call to warnings::import |
| 6 | |||||
| 7 | 3 | 19µs | 1 | 3µs | # spent 3µs within Moose::Meta::Method::Destructor::BEGIN@7 which was called
# once (3µs+0s) by Moose::Meta::Class::BEGIN@23 at line 7 # spent 3µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@7 |
| 8 | 3 | 20µs | 2 | 62µs | # spent 34µs (6+28) within Moose::Meta::Method::Destructor::BEGIN@8 which was called
# once (6µs+28µs) by Moose::Meta::Class::BEGIN@23 at line 8 # spent 34µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@8
# spent 28µs making 1 call to Exporter::import |
| 9 | 3 | 61µs | 1 | 3µs | # spent 3µs within Moose::Meta::Method::Destructor::BEGIN@9 which was called
# once (3µs+0s) by Moose::Meta::Class::BEGIN@23 at line 9 # spent 3µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@9 |
| 10 | |||||
| 11 | 1 | 600ns | our $VERSION = '0.98'; | ||
| 12 | 1 | 18µs | $VERSION = eval $VERSION; | ||
| 13 | 1 | 300ns | our $AUTHORITY = 'cpan:STEVAN'; | ||
| 14 | |||||
| 15 | # spent 78µs (7+71) within Moose::Meta::Method::Destructor::BEGIN@15 which was called
# once (7µs+71µs) by Moose::Meta::Class::BEGIN@23 at line 16 # spent 71µs making 1 call to base::import | ||||
| 16 | 3 | 352µs | 1 | 78µs | 'Class::MOP::Method::Inlined'; # spent 78µs making 1 call to Moose::Meta::Method::Destructor::BEGIN@15 |
| 17 | |||||
| 18 | # spent 350µs (162+188) within Moose::Meta::Method::Destructor::new which was called
# once (162µs+188µs) by Class::MOP::Class::_inline_destructor at line 1089 of Class/MOP/Class.pm | ||||
| 19 | 8 | 162µs | my $class = shift; | ||
| 20 | my %options = @_; | ||||
| 21 | |||||
| 22 | (ref $options{options} eq 'HASH') | ||||
| 23 | || $class->throw_error("You must pass a hash of options", data => $options{options}); | ||||
| 24 | |||||
| 25 | ($options{package_name} && $options{name}) | ||||
| 26 | || $class->throw_error("You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT"); | ||||
| 27 | |||||
| 28 | my $self = bless { | ||||
| 29 | # from our superclass | ||||
| 30 | 'body' => undef, | ||||
| 31 | 'package_name' => $options{package_name}, | ||||
| 32 | 'name' => $options{name}, | ||||
| 33 | # ... | ||||
| 34 | 'options' => $options{options}, | ||||
| 35 | 'associated_metaclass' => $options{metaclass}, | ||||
| 36 | } => $class; | ||||
| 37 | |||||
| 38 | # we don't want this creating | ||||
| 39 | # a cycle in the code, if not | ||||
| 40 | # needed | ||||
| 41 | weaken($self->{'associated_metaclass'}); # spent 900ns making 1 call to Scalar::Util::weaken | ||||
| 42 | |||||
| 43 | $self->_initialize_body; # spent 187µs making 1 call to Moose::Meta::Method::Destructor::_initialize_body | ||||
| 44 | |||||
| 45 | return $self; | ||||
| 46 | } | ||||
| 47 | |||||
| 48 | ## accessors | ||||
| 49 | |||||
| 50 | 1 | 3µs | # spent 2µs within Moose::Meta::Method::Destructor::options which was called
# once (2µs+0s) by Moose::Meta::Method::Destructor::_initialize_body at line 106 | ||
| 51 | |||||
| 52 | ## method | ||||
| 53 | |||||
| 54 | # spent 131µs (11+120) within Moose::Meta::Method::Destructor::is_needed which was called
# once (11µs+120µs) by Class::MOP::Class::_inline_destructor at line 1087 of Class/MOP/Class.pm | ||||
| 55 | 4 | 12µs | my $self = shift; | ||
| 56 | my $metaclass = shift; | ||||
| 57 | |||||
| 58 | ( blessed $metaclass && $metaclass->isa('Class::MOP::Class') ) # spent 1µs making 1 call to Scalar::Util::blessed
# spent 1µs making 1 call to UNIVERSAL::isa | ||||
| 59 | || $self->throw_error( | ||||
| 60 | "The is_needed method expected a metaclass object as its arugment"); | ||||
| 61 | |||||
| 62 | return $metaclass->find_method_by_name("DEMOLISHALL"); # spent 118µs making 1 call to Class::MOP::Class::find_method_by_name | ||||
| 63 | } | ||||
| 64 | |||||
| 65 | sub initialize_body { | ||||
| 66 | Carp::cluck('The initialize_body method has been made private.' | ||||
| 67 | . " The public version is deprecated and will be removed in a future release.\n"); | ||||
| 68 | shift->_initialize_body; | ||||
| 69 | } | ||||
| 70 | |||||
| 71 | # spent 187µs (29+158) within Moose::Meta::Method::Destructor::_initialize_body which was called
# once (29µs+158µs) by Moose::Meta::Method::Destructor::new at line 43 | ||||
| 72 | 9 | 22µs | my $self = shift; | ||
| 73 | # TODO: | ||||
| 74 | # the %options should also include a both | ||||
| 75 | # a call 'initializer' and call 'SUPER::' | ||||
| 76 | # options, which should cover approx 90% | ||||
| 77 | # of the possible use cases (even if it | ||||
| 78 | # requires some adaption on the part of | ||||
| 79 | # the author, after all, nothing is free) | ||||
| 80 | |||||
| 81 | my @DEMOLISH_methods = $self->associated_metaclass->find_all_methods_by_name('DEMOLISH'); # spent 85µs making 1 call to Class::MOP::Class::find_all_methods_by_name
# spent 1µs making 1 call to Class::MOP::Method::associated_metaclass | ||||
| 82 | |||||
| 83 | my $source; | ||||
| 84 | if ( @DEMOLISH_methods ) { | ||||
| 85 | $source = 'sub {'; | ||||
| 86 | $source .= 'my $self = shift;' . "\n"; | ||||
| 87 | |||||
| 88 | $source .= 'local $?;' . "\n"; | ||||
| 89 | |||||
| 90 | $source .= 'my $in_global_destruction = Devel::GlobalDestruction::in_global_destruction;' . "\n"; | ||||
| 91 | |||||
| 92 | $source .= 'Try::Tiny::try {' . "\n"; | ||||
| 93 | |||||
| 94 | $source .= '$self->' . $_->{class} . '::DEMOLISH($in_global_destruction);' . "\n" | ||||
| 95 | for @DEMOLISH_methods; | ||||
| 96 | |||||
| 97 | $source .= '}'; | ||||
| 98 | $source .= q[ Try::Tiny::catch { no warnings 'misc'; die $_ };] . "\n"; | ||||
| 99 | $source .= 'return;' . "\n"; | ||||
| 100 | |||||
| 101 | $source .= '}'; | ||||
| 102 | } else { | ||||
| 103 | $source = 'sub { }'; | ||||
| 104 | } | ||||
| 105 | |||||
| 106 | warn $source if $self->options->{debug}; # spent 2µs making 1 call to Moose::Meta::Method::Destructor::options | ||||
| 107 | |||||
| 108 | my ( $code, $e ) = $self->_compile_code( # spent 70µs making 1 call to Class::MOP::Method::Generated::_compile_code | ||||
| 109 | environment => {}, | ||||
| 110 | code => $source, | ||||
| 111 | ); | ||||
| 112 | |||||
| 113 | $self->throw_error( | ||||
| 114 | "Could not eval the destructor :\n\n$source\n\nbecause :\n\n$e", | ||||
| 115 | error => $e, data => $source ) | ||||
| 116 | if $e; | ||||
| 117 | |||||
| 118 | $self->{'body'} = $code; | ||||
| 119 | } | ||||
| 120 | |||||
| 121 | |||||
| 122 | 1 | 7µs | 1; | ||
| 123 | |||||
| 124 | __END__ | ||||
| 125 | |||||
| 126 | =pod | ||||
| 127 | |||||
| 128 | =head1 NAME | ||||
| 129 | |||||
| 130 | Moose::Meta::Method::Destructor - Method Meta Object for destructors | ||||
| 131 | |||||
| 132 | =head1 DESCRIPTION | ||||
| 133 | |||||
| 134 | This class is a subclass of L<Class::MOP::Class::Generated> that | ||||
| 135 | provides Moose-specific functionality for inlining destructors. | ||||
| 136 | |||||
| 137 | To understand this class, you should read the the | ||||
| 138 | L<Class::MOP::Class::Generated> documentation as well. | ||||
| 139 | |||||
| 140 | =head1 INHERITANCE | ||||
| 141 | |||||
| 142 | C<Moose::Meta::Method::Destructor> is a subclass of | ||||
| 143 | L<Moose::Meta::Method> I<and> L<Class::MOP::Method::Generated>. | ||||
| 144 | |||||
| 145 | =head1 METHODS | ||||
| 146 | |||||
| 147 | =over 4 | ||||
| 148 | |||||
| 149 | =item B<< Moose::Meta;:Method::Destructor->new(%options) >> | ||||
| 150 | |||||
| 151 | This constructs a new object. It accepts the following options: | ||||
| 152 | |||||
| 153 | =over 8 | ||||
| 154 | |||||
| 155 | =item * package_name | ||||
| 156 | |||||
| 157 | The package for the class in which the destructor is being | ||||
| 158 | inlined. This option is required. | ||||
| 159 | |||||
| 160 | =item * name | ||||
| 161 | |||||
| 162 | The name of the destructor method. This option is required. | ||||
| 163 | |||||
| 164 | =item * metaclass | ||||
| 165 | |||||
| 166 | The metaclass for the class this destructor belongs to. This is | ||||
| 167 | optional, as it can be set later by calling C<< | ||||
| 168 | $metamethod->attach_to_class >>. | ||||
| 169 | |||||
| 170 | =back | ||||
| 171 | |||||
| 172 | =item B<< Moose::Meta;:Method::Destructor->is_needed($metaclass) >> | ||||
| 173 | |||||
| 174 | Given a L<Moose::Meta::Class> object, this method returns a boolean | ||||
| 175 | indicating whether the class needs a destructor. If the class or any | ||||
| 176 | of its parents defines a C<DEMOLISH> method, it needs a destructor. | ||||
| 177 | |||||
| 178 | =back | ||||
| 179 | |||||
| 180 | =head1 BUGS | ||||
| 181 | |||||
| 182 | See L<Moose/BUGS> for details on reporting bugs. | ||||
| 183 | |||||
| 184 | =head1 AUTHORS | ||||
| 185 | |||||
| 186 | Stevan Little E<lt>stevan@iinteractive.comE<gt> | ||||
| 187 | |||||
| 188 | =head1 COPYRIGHT AND LICENSE | ||||
| 189 | |||||
| 190 | Copyright 2006-2010 by Infinity Interactive, Inc. | ||||
| 191 | |||||
| 192 | L<http://www.iinteractive.com> | ||||
| 193 | |||||
| 194 | This library is free software; you can redistribute it and/or modify | ||||
| 195 | it under the same terms as Perl itself. | ||||
| 196 | |||||
| 197 | =cut | ||||
| 198 |