File | /usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP/Method.pm |
Statements Executed | 5221 |
Statement Execution Time | 9.93ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
309 | 5 | 4 | 4.86ms | 10.9ms | wrap | Class::MOP::Method::
630 | 1 | 1 | 2.28ms | 2.77ms | attach_to_class | Class::MOP::Method::
1536 | 8 | 7 | 937µs | 937µs | body (xsub) | Class::MOP::Method::
62 | 2 | 2 | 513µs | 1.54ms | _new | Class::MOP::Method::
82 | 5 | 4 | 331µs | 370µs | __ANON__[:19] | Class::MOP::Method::
630 | 1 | 2 | 311µs | 311µs | package_name (xsub) | Class::MOP::Method::
154 | 1 | 1 | 235µs | 235µs | _set_original_method | Class::MOP::Method::
119 | 4 | 3 | 80µs | 80µs | name (xsub) | Class::MOP::Method::
48 | 7 | 4 | 58µs | 58µs | associated_metaclass | Class::MOP::Method::
1 | 1 | 1 | 13µs | 16µs | BEGIN@4 | Class::MOP::Method::
1 | 1 | 1 | 10µs | 48µs | BEGIN@19 | Class::MOP::Method::
1 | 1 | 1 | 6µs | 45µs | BEGIN@14 | Class::MOP::Method::
1 | 1 | 1 | 6µs | 15µs | BEGIN@5 | Class::MOP::Method::
1 | 1 | 1 | 6µs | 40µs | BEGIN@8 | Class::MOP::Method::
1 | 1 | 1 | 6µs | 28µs | BEGIN@7 | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | detach_from_class | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | execute | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | fully_qualified_name | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | original_fully_qualified_name | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | original_method | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | original_name | Class::MOP::Method::
0 | 0 | 0 | 0s | 0s | original_package_name | Class::MOP::Method::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | |||||
2 | package Class::MOP::Method; | ||||
3 | |||||
4 | 3 | 20µs | 2 | 19µs | # spent 16µs (13+3) within Class::MOP::Method::BEGIN@4 which was called
# once (13µs+3µs) by base::import at line 4 # spent 16µs making 1 call to Class::MOP::Method::BEGIN@4
# spent 3µs making 1 call to strict::import |
5 | 3 | 20µs | 2 | 23µs | # spent 15µs (6+9) within Class::MOP::Method::BEGIN@5 which was called
# once (6µs+9µs) by base::import at line 5 # spent 15µs making 1 call to Class::MOP::Method::BEGIN@5
# spent 8µs making 1 call to warnings::import |
6 | |||||
7 | 3 | 22µs | 2 | 51µs | # spent 28µs (6+23) within Class::MOP::Method::BEGIN@7 which was called
# once (6µs+23µs) by base::import at line 7 # spent 28µs making 1 call to Class::MOP::Method::BEGIN@7
# spent 23µs making 1 call to Exporter::import |
8 | 3 | 40µs | 2 | 74µs | # spent 40µs (6+34) within Class::MOP::Method::BEGIN@8 which was called
# once (6µs+34µs) by base::import at line 8 # spent 40µs making 1 call to Class::MOP::Method::BEGIN@8
# spent 34µs making 1 call to Exporter::import |
9 | |||||
10 | 1 | 600ns | our $VERSION = '0.98'; | ||
11 | 1 | 13µs | $VERSION = eval $VERSION; | ||
12 | 1 | 300ns | our $AUTHORITY = 'cpan:STEVAN'; | ||
13 | |||||
14 | 3 | 47µs | 2 | 45µs | # spent 45µs (6+38) within Class::MOP::Method::BEGIN@14 which was called
# once (6µs+38µs) by base::import at line 14 # spent 45µs making 1 call to Class::MOP::Method::BEGIN@14
# spent 38µs making 1 call to base::import, recursion: max depth 1, time 38µs |
15 | |||||
16 | # NOTE: | ||||
17 | # if poked in the right way, | ||||
18 | # they should act like CODE refs. | ||||
19 | 85 | 821µs | 84 | 126µs | # spent 48µs (10+38) within Class::MOP::Method::BEGIN@19 which was called
# once (10µs+38µs) by base::import at line 19
# spent 370µs (331+40) within Class::MOP::Method::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP/Method.pm:19] which was called 82 times, avg 5µs/call:
# 58 times (248µs+26µs) by Foo::Domain::size or Moose::Meta::Class::new_object at line 267 of Moose/Meta/Class.pm, avg 5µs/call
# 18 times (56µs+9µs) by Class::MOP::Class:::after or MooseX::AttributeHelpers::MethodProvider::Hash::delete or MooseX::AttributeHelpers::MethodProvider::Hash::set or MooseX::AttributeHelpers::MethodProvider::ImmutableHash::exists or MooseX::AttributeHelpers::MethodProvider::ImmutableHash::get or MooseX::AttributeHelpers::MethodProvider::ImmutableHash::keys at line 181 of MooseX/AttributeHelpers/Trait/Base.pm, avg 4µs/call
# 2 times (13µs+2µs) by Class::MOP::Class::__ANON__::SERIAL::1::get_class_attribute_map or Class::MOP::Class::__ANON__::SERIAL::1::has_class_attribute at line 10 of MooseX/AttributeHelpers/MethodProvider/ImmutableHash.pm, avg 8µs/call
# 2 times (7µs+1µs) by Class::MOP::Class::__ANON__::SERIAL::1::_add_class_attribute or Class::MOP::Class::__ANON__::SERIAL::1::get_class_attribute_map at line 30 of MooseX/AttributeHelpers/MethodProvider/Hash.pm, avg 4µs/call
# 2 times (7µs+1µs) by Class::MOP::Class::__ANON__::SERIAL::1::_class_attribute_values or Class::MOP::Class::__ANON__::SERIAL::1::set_class_attribute_value at line 36 of MooseX/AttributeHelpers/MethodProvider/Hash.pm, avg 4µs/call # spent 48µs making 1 call to Class::MOP::Method::BEGIN@19
# spent 40µs making 82 calls to Class::MOP::Method::body, avg 483ns/call
# spent 38µs making 1 call to overload::import |
20 | |||||
21 | # construction | ||||
22 | |||||
23 | # spent 10.9ms (4.86+6.02) within Class::MOP::Method::wrap which was called 309 times, avg 35µs/call:
# 141 times (2.24ms+1.79ms) by Class::MOP::Mixin::HasMethods::wrap_method_body at line 31 of Class/MOP/Mixin/HasMethods.pm, avg 29µs/call
# 100 times (1.57ms+1.03ms) by Class::MOP::Method::Wrapped::wrap at line 92 of Class/MOP/Method/Wrapped.pm, avg 26µs/call
# 57 times (881µs+743µs) by Class::MOP::Attribute::_process_accessors at line 310 of Class/MOP/Attribute.pm, avg 28µs/call
# 9 times (127µs+2.44ms) by Class::MOP::Class:::after at line 181 of MooseX/AttributeHelpers/Trait/Base.pm, avg 285µs/call
# 2 times (32µs+21µs) by Class::MOP::Attribute::get_write_method_ref at line 209 of Class/MOP/Attribute.pm, avg 27µs/call | ||||
24 | 2781 | 5.01ms | my ( $class, @args ) = @_; | ||
25 | |||||
26 | unshift @args, 'body' if @args % 2 == 1; | ||||
27 | |||||
28 | my %params = @args; | ||||
29 | my $code = $params{body}; | ||||
30 | |||||
31 | if (blessed($code) && $code->isa(__PACKAGE__)) { # spent 193µs making 309 calls to Scalar::Util::blessed, avg 623ns/call
# spent 179µs making 309 calls to Scalar::Util::reftype, avg 579ns/call | ||||
32 | my $method = $code->clone; | ||||
33 | delete $params{body}; | ||||
34 | Class::MOP::class_of($class)->rebless_instance($method, %params); | ||||
35 | return $method; | ||||
36 | } | ||||
37 | elsif (!ref $code || 'CODE' ne reftype($code)) { | ||||
38 | confess "You must supply a CODE reference to bless, not (" . ($code || 'undef') . ")"; | ||||
39 | } | ||||
40 | |||||
41 | ($params{package_name} && $params{name}) | ||||
42 | || confess "You must supply the package_name and name parameters"; | ||||
43 | |||||
44 | my $self = $class->_new(\%params); # spent 2.70ms making 17 calls to Moose::Meta::Method::_new, avg 159µs/call
# spent 921µs making 100 calls to Class::MOP::Method::Wrapped::_new, avg 9µs/call
# spent 755µs making 75 calls to Moose::Meta::Role::Method::_new, avg 10µs/call
# spent 649µs making 57 calls to Class::MOP::Method::Accessor::_new, avg 11µs/call
# spent 498µs making 60 calls to Class::MOP::Method::_new, avg 8µs/call | ||||
45 | |||||
46 | weaken($self->{associated_metaclass}) if $self->{associated_metaclass}; # spent 127µs making 141 calls to Scalar::Util::weaken, avg 901ns/call | ||||
47 | |||||
48 | return $self; | ||||
49 | } | ||||
50 | |||||
51 | # spent 1.54ms (513µs+1.02) within Class::MOP::Method::_new which was called 62 times, avg 25µs/call:
# 60 times (498µs+0s) by Class::MOP::Method::wrap at line 44, avg 8µs/call
# 2 times (15µs+1.02ms) by Class::MOP::Method::Accessor::new at line 32 of Class/MOP/Method/Accessor.pm, avg 520µs/call | ||||
52 | 244 | 540µs | my $class = shift; | ||
53 | |||||
54 | return Class::MOP::Class->initialize($class)->new_object(@_) # spent 976µs making 2 calls to Class::MOP::Class::new_object, avg 488µs/call
# spent 48µs making 2 calls to Class::MOP::Class::initialize, avg 24µs/call | ||||
55 | if $class ne __PACKAGE__; | ||||
56 | |||||
57 | my $params = @_ == 1 ? $_[0] : {@_}; | ||||
58 | |||||
59 | return bless { | ||||
60 | 'body' => $params->{body}, | ||||
61 | 'associated_metaclass' => $params->{associated_metaclass}, | ||||
62 | 'package_name' => $params->{package_name}, | ||||
63 | 'name' => $params->{name}, | ||||
64 | 'original_method' => $params->{original_method}, | ||||
65 | } => $class; | ||||
66 | } | ||||
67 | |||||
68 | ## accessors | ||||
69 | |||||
70 | 48 | 119µs | # spent 58µs within Class::MOP::Method::associated_metaclass which was called 48 times, avg 1µs/call:
# 12 times (14µs+0s) by Class::MOP::Method::Inlined::can_be_inlined at line 34 of Class/MOP/Method/Inlined.pm, avg 1µs/call
# 6 times (15µs+0s) by Moose::Meta::Method::Constructor::_initialize_body at line 63 of Moose/Meta/Method/Constructor.pm, avg 2µs/call
# 6 times (7µs+0s) by Moose::Meta::Method::Constructor::_generate_BUILDALL at line 153 of Moose/Meta/Method/Constructor.pm, avg 1µs/call
# 6 times (6µs+0s) by Moose::Meta::Method::Destructor::_initialize_body at line 81 of Moose/Meta/Method/Destructor.pm, avg 1µs/call
# 6 times (6µs+0s) by Class::MOP::Method::Constructor::_meta_instance at line 77 of Class/MOP/Method/Constructor.pm, avg 950ns/call
# 6 times (5µs+0s) by Class::MOP::Method::Constructor::_attributes at line 82 of Class/MOP/Method/Constructor.pm, avg 767ns/call
# 6 times (4µs+0s) by Moose::Meta::Method::Constructor::_generate_BUILDARGS at line 135 of Moose/Meta/Method/Constructor.pm, avg 750ns/call | ||
71 | |||||
72 | # spent 2.77ms (2.28+493µs) within Class::MOP::Method::attach_to_class which was called 630 times, avg 4µs/call:
# 630 times (2.28ms+493µs) by Class::MOP::Mixin::HasMethods::add_method at line 52 of Class/MOP/Mixin/HasMethods.pm, avg 4µs/call | ||||
73 | 1890 | 2.93ms | my ( $self, $class ) = @_; | ||
74 | $self->{associated_metaclass} = $class; | ||||
75 | weaken($self->{associated_metaclass}); # spent 493µs making 630 calls to Scalar::Util::weaken, avg 783ns/call | ||||
76 | } | ||||
77 | |||||
78 | sub detach_from_class { | ||||
79 | my $self = shift; | ||||
80 | delete $self->{associated_metaclass}; | ||||
81 | } | ||||
82 | |||||
83 | sub fully_qualified_name { | ||||
84 | my $self = shift; | ||||
85 | $self->package_name . '::' . $self->name; | ||||
86 | } | ||||
87 | |||||
88 | sub original_method { (shift)->{'original_method'} } | ||||
89 | |||||
90 | 154 | 341µs | # spent 235µs within Class::MOP::Method::_set_original_method which was called 154 times, avg 2µs/call:
# 154 times (235µs+0s) by Class::MOP::Method::clone at line 539 of Class/MOP.pm, avg 2µs/call | ||
91 | |||||
92 | # It's possible that this could cause a loop if there is a circular | ||||
93 | # reference in here. That shouldn't ever happen in normal | ||||
94 | # circumstances, since original method only gets set when clone is | ||||
95 | # called. We _could_ check for such a loop, but it'd involve some sort | ||||
96 | # of package-lexical variable, and wouldn't be terribly subclassable. | ||||
97 | sub original_package_name { | ||||
98 | my $self = shift; | ||||
99 | |||||
100 | $self->original_method | ||||
101 | ? $self->original_method->original_package_name | ||||
102 | : $self->package_name; | ||||
103 | } | ||||
104 | |||||
105 | sub original_name { | ||||
106 | my $self = shift; | ||||
107 | |||||
108 | $self->original_method | ||||
109 | ? $self->original_method->original_name | ||||
110 | : $self->name; | ||||
111 | } | ||||
112 | |||||
113 | sub original_fully_qualified_name { | ||||
114 | my $self = shift; | ||||
115 | |||||
116 | $self->original_method | ||||
117 | ? $self->original_method->original_fully_qualified_name | ||||
118 | : $self->fully_qualified_name; | ||||
119 | } | ||||
120 | |||||
121 | sub execute { | ||||
122 | my $self = shift; | ||||
123 | $self->body->(@_); | ||||
124 | } | ||||
125 | |||||
126 | # NOTE: | ||||
127 | # the Class::MOP bootstrap | ||||
128 | # will create this for us | ||||
129 | # - SL | ||||
130 | # sub clone { ... } | ||||
131 | |||||
132 | 1 | 4µs | 1; | ||
133 | |||||
134 | __END__ | ||||
135 | |||||
136 | =pod | ||||
137 | |||||
138 | =head1 NAME | ||||
139 | |||||
140 | Class::MOP::Method - Method Meta Object | ||||
141 | |||||
142 | =head1 DESCRIPTION | ||||
143 | |||||
144 | The Method Protocol is very small, since methods in Perl 5 are just | ||||
145 | subroutines in a specific package. We provide a very basic | ||||
146 | introspection interface. | ||||
147 | |||||
148 | =head1 METHODS | ||||
149 | |||||
150 | =over 4 | ||||
151 | |||||
152 | =item B<< Class::MOP::Method->wrap($code, %options) >> | ||||
153 | |||||
154 | This is the constructor. It accepts a method body in the form of | ||||
155 | either a code reference or a L<Class::MOP::Method> instance, followed | ||||
156 | by a hash of options. | ||||
157 | |||||
158 | The options are: | ||||
159 | |||||
160 | =over 8 | ||||
161 | |||||
162 | =item * name | ||||
163 | |||||
164 | The method name (without a package name). This is required if C<$code> | ||||
165 | is a coderef. | ||||
166 | |||||
167 | =item * package_name | ||||
168 | |||||
169 | The package name for the method. This is required if C<$code> is a | ||||
170 | coderef. | ||||
171 | |||||
172 | =item * associated_metaclass | ||||
173 | |||||
174 | An optional L<Class::MOP::Class> object. This is the metaclass for the | ||||
175 | method's class. | ||||
176 | |||||
177 | =back | ||||
178 | |||||
179 | =item B<< $metamethod->clone(%params) >> | ||||
180 | |||||
181 | This makes a shallow clone of the method object. In particular, | ||||
182 | subroutine reference itself is shared between all clones of a given | ||||
183 | method. | ||||
184 | |||||
185 | When a method is cloned, the original method object will be available | ||||
186 | by calling C<original_method> on the clone. | ||||
187 | |||||
188 | =item B<< $metamethod->body >> | ||||
189 | |||||
190 | This returns a reference to the method's subroutine. | ||||
191 | |||||
192 | =item B<< $metamethod->name >> | ||||
193 | |||||
194 | This returns the method's name | ||||
195 | |||||
196 | =item B<< $metamethod->package_name >> | ||||
197 | |||||
198 | This returns the method's package name. | ||||
199 | |||||
200 | =item B<< $metamethod->fully_qualified_name >> | ||||
201 | |||||
202 | This returns the method's fully qualified name (package name and | ||||
203 | method name). | ||||
204 | |||||
205 | =item B<< $metamethod->associated_metaclass >> | ||||
206 | |||||
207 | This returns the L<Class::MOP::Class> object for the method, if one | ||||
208 | exists. | ||||
209 | |||||
210 | =item B<< $metamethod->original_method >> | ||||
211 | |||||
212 | If this method object was created as a clone of some other method | ||||
213 | object, this returns the object that was cloned. | ||||
214 | |||||
215 | =item B<< $metamethod->original_name >> | ||||
216 | |||||
217 | This returns the method's original name, wherever it was first | ||||
218 | defined. | ||||
219 | |||||
220 | If this method is a clone of a clone (of a clone, etc.), this method | ||||
221 | returns the name from the I<first> method in the chain of clones. | ||||
222 | |||||
223 | =item B<< $metamethod->original_package_name >> | ||||
224 | |||||
225 | This returns the method's original package name, wherever it was first | ||||
226 | defined. | ||||
227 | |||||
228 | If this method is a clone of a clone (of a clone, etc.), this method | ||||
229 | returns the package name from the I<first> method in the chain of | ||||
230 | clones. | ||||
231 | |||||
232 | =item B<< $metamethod->original_fully_qualified_name >> | ||||
233 | |||||
234 | This returns the method's original fully qualified name, wherever it | ||||
235 | was first defined. | ||||
236 | |||||
237 | If this method is a clone of a clone (of a clone, etc.), this method | ||||
238 | returns the fully qualified name from the I<first> method in the chain | ||||
239 | of clones. | ||||
240 | |||||
241 | =item B<< $metamethod->attach_to_class($metaclass) >> | ||||
242 | |||||
243 | Given a L<Class::MOP::Class> object, this method sets the associated | ||||
244 | metaclass for the method. This will overwrite any existing associated | ||||
245 | metaclass. | ||||
246 | |||||
247 | =item B<< $metamethod->detach_from_class >> | ||||
248 | |||||
249 | Removes any associated metaclass object for the method. | ||||
250 | |||||
251 | =item B<< $metamethod->execute(...) >> | ||||
252 | |||||
253 | This executes the method. Any arguments provided will be passed on to | ||||
254 | the method itself. | ||||
255 | |||||
256 | =item B<< Class::MOP::Method->meta >> | ||||
257 | |||||
258 | This will return a L<Class::MOP::Class> instance for this class. | ||||
259 | |||||
260 | It should also be noted that L<Class::MOP> will actually bootstrap | ||||
261 | this module by installing a number of attribute meta-objects into its | ||||
262 | metaclass. | ||||
263 | |||||
264 | =back | ||||
265 | |||||
266 | =head1 AUTHORS | ||||
267 | |||||
268 | Stevan Little E<lt>stevan@iinteractive.comE<gt> | ||||
269 | |||||
270 | =head1 COPYRIGHT AND LICENSE | ||||
271 | |||||
272 | Copyright 2006-2010 by Infinity Interactive, Inc. | ||||
273 | |||||
274 | L<http://www.iinteractive.com> | ||||
275 | |||||
276 | This library is free software; you can redistribute it and/or modify | ||||
277 | it under the same terms as Perl itself. | ||||
278 | |||||
279 | =cut | ||||
280 | |||||
# spent 937µs within Class::MOP::Method::body which was called 1536 times, avg 610ns/call:
# 630 times (379µs+0s) by Class::MOP::Mixin::HasMethods::add_method at line 44 of Class/MOP/Mixin/HasMethods.pm, avg 602ns/call
# 596 times (402µs+0s) by Class::MOP::Mixin::HasMethods::get_method at line 115 of Class/MOP/Mixin/HasMethods.pm, avg 675ns/call
# 100 times (42µs+0s) by Class::MOP::Method::Wrapped::wrap at line 77 of Class/MOP/Method/Wrapped.pm, avg 424ns/call
# 82 times (40µs+0s) by Class::MOP::Method::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/darwin-2level/Class/MOP/Method.pm:19] at line 19 of Class/MOP/Method.pm, avg 483ns/call
# 65 times (31µs+0s) by Class::MOP::Method::Wrapped::add_around_modifier at line 168 of Class/MOP/Method/Wrapped.pm, avg 477ns/call
# 55 times (38µs+0s) by Class::MOP::Class::_immutable_metaclass at line 970 of Class/MOP/Class.pm, avg 684ns/call
# 6 times (4µs+0s) by Moose::Meta::Method::Constructor::_generate_BUILDARGS at line 137 of Moose/Meta/Method/Constructor.pm, avg 650ns/call
# 2 times (1µs+0s) by Moose::Meta::Role::Application::ToRole::apply_methods at line 77 of Moose/Meta/Role/Application/ToRole.pm, avg 500ns/call | |||||
# spent 80µs within Class::MOP::Method::name which was called 119 times, avg 672ns/call:
# 64 times (47µs+0s) by Class::MOP::Class::_immutable_metaclass at line 968 of Class/MOP/Class.pm, avg 742ns/call
# 43 times (26µs+0s) by Class::MOP::Method::Inlined::can_be_inlined at line 40 of Class/MOP/Method/Inlined.pm, avg 600ns/call
# 6 times (4µs+0s) by Class::MOP::Method::Inlined::can_be_inlined at line 58 of Class/MOP/Method/Inlined.pm, avg 617ns/call
# 6 times (3µs+0s) by Class::MOP::Method::Inlined::can_be_inlined at line 70 of Class/MOP/Method/Inlined.pm, avg 500ns/call | |||||
# spent 311µs within Class::MOP::Method::package_name which was called 630 times, avg 493ns/call:
# 630 times (311µs+0s) by Class::MOP::Mixin::HasMethods::add_method at line 45 of Class/MOP/Mixin/HasMethods.pm, avg 493ns/call |