← Index
NYTProf Performance Profile   « block view • line view • sub view »
For xt/tapper-mcp-scheduler-with-db-longrun.t
  Run on Tue May 22 17:18:39 2012
Reported on Tue May 22 17:23:27 2012

Filename/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/Class/MOP/Mixin/HasMethods.pm
StatementsExecuted 11116 statements in 30.4ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
39019810.2ms26.2msClass::MOP::Mixin::HasMethods::::add_methodClass::MOP::Mixin::HasMethods::add_method
530213.68ms11.6msClass::MOP::Mixin::HasMethods::::_get_maybe_raw_methodClass::MOP::Mixin::HasMethods::_get_maybe_raw_method
482972.64ms16.8msClass::MOP::Mixin::HasMethods::::get_methodClass::MOP::Mixin::HasMethods::get_method
390111.80ms2.61msClass::MOP::Mixin::HasMethods::::update_package_cache_flagClass::MOP::Mixin::HasMethods::update_package_cache_flag
3565914µs20.1msClass::MOP::Mixin::HasMethods::::_add_meta_methodClass::MOP::Mixin::HasMethods::_add_meta_method
6611720µs3.29msClass::MOP::Mixin::HasMethods::::wrap_method_bodyClass::MOP::Mixin::HasMethods::wrap_method_body
12511693µs902µsClass::MOP::Mixin::HasMethods::::_code_is_mineClass::MOP::Mixin::HasMethods::_code_is_mine
39011634µs634µsClass::MOP::Mixin::HasMethods::::CORE:matchClass::MOP::Mixin::HasMethods::CORE:match (opcode)
111568µs3.50msClass::MOP::Mixin::HasMethods::::BEGIN@12Class::MOP::Mixin::HasMethods::BEGIN@12
1921534µs6.58msClass::MOP::Mixin::HasMethods::::_full_method_mapClass::MOP::Mixin::HasMethods::_full_method_map
4833328µs1.36msClass::MOP::Mixin::HasMethods::::has_methodClass::MOP::Mixin::HasMethods::has_method
111324µs474µsClass::MOP::Mixin::HasMethods::::BEGIN@13Class::MOP::Mixin::HasMethods::BEGIN@13
111180µs656µsClass::MOP::Mixin::HasMethods::::BEGIN@17Class::MOP::Mixin::HasMethods::BEGIN@17
1822110µs5.25msClass::MOP::Mixin::HasMethods::::_get_local_methodsClass::MOP::Mixin::HasMethods::_get_local_methods
242147µs47µsClass::MOP::Mixin::HasMethods::::_meta_method_classClass::MOP::Mixin::HasMethods::_meta_method_class
11131µs1.47msClass::MOP::Mixin::HasMethods::::get_method_listClass::MOP::Mixin::HasMethods::get_method_list
41111µs11µsClass::MOP::Mixin::HasMethods::::reset_package_cache_flagClass::MOP::Mixin::HasMethods::reset_package_cache_flag
1118µs8µsClass::MOP::Mixin::HasMethods::::BEGIN@2Class::MOP::Mixin::HasMethods::BEGIN@2
1117µs30µsClass::MOP::Mixin::HasMethods::::BEGIN@15Class::MOP::Mixin::HasMethods::BEGIN@15
1117µs58µsClass::MOP::Mixin::HasMethods::::BEGIN@21Class::MOP::Mixin::HasMethods::BEGIN@21
1117µs16µsClass::MOP::Mixin::HasMethods::::BEGIN@10Class::MOP::Mixin::HasMethods::BEGIN@10
1116µs9µsClass::MOP::Mixin::HasMethods::::BEGIN@9Class::MOP::Mixin::HasMethods::BEGIN@9
1116µs24µsClass::MOP::Mixin::HasMethods::::BEGIN@16Class::MOP::Mixin::HasMethods::BEGIN@16
1115µs5µsClass::MOP::Mixin::HasMethods::::BEGIN@19Class::MOP::Mixin::HasMethods::BEGIN@19
0000s0sClass::MOP::Mixin::HasMethods::::_get_overloaded_operator_bodyClass::MOP::Mixin::HasMethods::_get_overloaded_operator_body
0000s0sClass::MOP::Mixin::HasMethods::::_overload_mapClass::MOP::Mixin::HasMethods::_overload_map
0000s0sClass::MOP::Mixin::HasMethods::::_restore_metamethods_fromClass::MOP::Mixin::HasMethods::_restore_metamethods_from
0000s0sClass::MOP::Mixin::HasMethods::::_wrap_overloadClass::MOP::Mixin::HasMethods::_wrap_overload
0000s0sClass::MOP::Mixin::HasMethods::::add_overloaded_operatorClass::MOP::Mixin::HasMethods::add_overloaded_operator
0000s0sClass::MOP::Mixin::HasMethods::::get_all_overloaded_operatorsClass::MOP::Mixin::HasMethods::get_all_overloaded_operators
0000s0sClass::MOP::Mixin::HasMethods::::get_overload_listClass::MOP::Mixin::HasMethods::get_overload_list
0000s0sClass::MOP::Mixin::HasMethods::::get_overloaded_operatorClass::MOP::Mixin::HasMethods::get_overloaded_operator
0000s0sClass::MOP::Mixin::HasMethods::::has_overloaded_operatorClass::MOP::Mixin::HasMethods::has_overloaded_operator
0000s0sClass::MOP::Mixin::HasMethods::::is_overloadedClass::MOP::Mixin::HasMethods::is_overloaded
0000s0sClass::MOP::Mixin::HasMethods::::overload_operatorsClass::MOP::Mixin::HasMethods::overload_operators
0000s0sClass::MOP::Mixin::HasMethods::::remove_methodClass::MOP::Mixin::HasMethods::remove_method
0000s0sClass::MOP::Mixin::HasMethods::::remove_overloaded_operatorClass::MOP::Mixin::HasMethods::remove_overloaded_operator
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Class::MOP::Mixin::HasMethods;
2
# spent 8µs within Class::MOP::Mixin::HasMethods::BEGIN@2 which was called: # once (8µs+0s) by Class::MOP::BEGIN@25 at line 4
BEGIN {
314µs $Class::MOP::Mixin::HasMethods::AUTHORITY = 'cpan:STEVAN';
4121µs18µs}
# spent 8µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@2
5{
621µs $Class::MOP::Mixin::HasMethods::VERSION = '2.0602';
7}
8
9317µs211µs
# spent 9µs (6+2) within Class::MOP::Mixin::HasMethods::BEGIN@9 which was called: # once (6µs+2µs) by Class::MOP::BEGIN@25 at line 9
use strict;
# spent 9µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@9 # spent 2µs making 1 call to strict::import
10317µs224µs
# spent 16µs (7+9) within Class::MOP::Mixin::HasMethods::BEGIN@10 which was called: # once (7µs+9µs) by Class::MOP::BEGIN@25 at line 10
use warnings;
# spent 16µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@10 # spent 9µs making 1 call to warnings::import
11
12390µs13.50ms
# spent 3.50ms (568µs+2.93) within Class::MOP::Mixin::HasMethods::BEGIN@12 which was called: # once (568µs+2.93ms) by Class::MOP::BEGIN@25 at line 12
use Class::MOP::Method::Meta;
# spent 3.50ms making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@12
13394µs1474µs
# spent 474µs (324+149) within Class::MOP::Mixin::HasMethods::BEGIN@13 which was called: # once (324µs+149µs) by Class::MOP::BEGIN@25 at line 13
use Class::MOP::Method::Overload;
# spent 474µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@13
14
15319µs252µs
# spent 30µs (7+23) within Class::MOP::Mixin::HasMethods::BEGIN@15 which was called: # once (7µs+23µs) by Class::MOP::BEGIN@25 at line 15
use Scalar::Util 'blessed';
# spent 30µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@15 # spent 22µs making 1 call to Exporter::import
16319µs242µs
# spent 24µs (6+18) within Class::MOP::Mixin::HasMethods::BEGIN@16 which was called: # once (6µs+18µs) by Class::MOP::BEGIN@25 at line 16
use Carp 'confess';
# spent 24µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@16 # spent 18µs making 1 call to Exporter::import
17397µs2689µs
# spent 656µs (180+476) within Class::MOP::Mixin::HasMethods::BEGIN@17 which was called: # once (180µs+476µs) by Class::MOP::BEGIN@25 at line 17
use Sub::Name 'subname';
# spent 656µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@17 # spent 33µs making 1 call to Exporter::import
18
19318µs15µs
# spent 5µs within Class::MOP::Mixin::HasMethods::BEGIN@19 which was called: # once (5µs+0s) by Class::MOP::BEGIN@25 at line 19
use overload ();
# spent 5µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@19
20
2131.08ms2108µs
# spent 58µs (7+51) within Class::MOP::Mixin::HasMethods::BEGIN@21 which was called: # once (7µs+51µs) by Class::MOP::BEGIN@25 at line 21
use base 'Class::MOP::Mixin';
# spent 58µs making 1 call to Class::MOP::Mixin::HasMethods::BEGIN@21 # spent 51µs making 1 call to base::import
22
232463µs
# spent 47µs within Class::MOP::Mixin::HasMethods::_meta_method_class which was called 24 times, avg 2µs/call: # 22 times (43µs+0s) by Class::MOP::Mixin::HasMethods::_add_meta_method at line 33, avg 2µs/call # 2 times (4µs+0s) by Class::MOP::Mixin::HasMethods::_add_meta_method at line 31, avg 2µs/call
sub _meta_method_class { 'Class::MOP::Method::Meta' }
24
25
# spent 20.1ms (914µs+19.2) within Class::MOP::Mixin::HasMethods::_add_meta_method which was called 35 times, avg 574µs/call: # 20 times (409µs+9.22ms) by metaclass::import at line 49 of metaclass.pm, avg 482µs/call # 7 times (183µs+3.98ms) by Moose::init_meta at line 211 of Moose.pm, avg 595µs/call # 4 times (115µs+1.96ms) by Moose::Role::init_meta at line 152 of Moose/Role.pm, avg 518µs/call # 2 times (90µs+2.27ms) by Class::MOP::Class::create at line 448 of Class/MOP/Class.pm, avg 1.18ms/call # once (82µs+1.23ms) by Moose::Exporter::BEGIN@13 at line 660 of Class/MOP.pm # once (35µs+504µs) by Moose::Exporter::BEGIN@13 at line 666 of Class/MOP.pm
sub _add_meta_method {
263527µs my $self = shift;
273532µs my ($name) = @_;
2835301µs703.35ms my $existing_method = $self->can('find_method_by_name')
# spent 3.19ms making 31 calls to Class::MOP::Class::find_method_by_name, avg 103µs/call # spent 93µs making 4 calls to Moose::Meta::Role::find_method_by_name, avg 23µs/call # spent 75µs making 35 calls to UNIVERSAL::can, avg 2µs/call
29 ? $self->find_method_by_name($name)
30 : $self->get_method($name);
313535µs48µs return if $existing_method
# spent 4µs making 2 calls to Class::MOP::Mixin::HasMethods::_meta_method_class, avg 2µs/call # spent 4µs making 2 calls to UNIVERSAL::isa, avg 2µs/call
32 && $existing_method->isa($self->_meta_method_class);
3335547µs14015.8ms $self->add_method(
# spent 6.61ms making 13 calls to Moose::Meta::Method::Meta::wrap, avg 508µs/call # spent 6.24ms making 22 calls to Class::MOP::Method::Meta::wrap, avg 284µs/call # spent 2.86ms making 35 calls to Class::MOP::Mixin::HasMethods::add_method, avg 82µs/call # spent 43µs making 22 calls to Class::MOP::Mixin::HasMethods::_meta_method_class, avg 2µs/call # spent 21µs making 35 calls to Class::MOP::Package::name, avg 609ns/call # spent 18µs making 9 calls to Moose::Meta::Class::_meta_method_class, avg 2µs/call # spent 7µs making 4 calls to Moose::Meta::Role::_meta_method_class, avg 2µs/call
34 $name => $self->_meta_method_class->wrap(
35 name => $name,
36 package_name => $self->name,
37 associated_metaclass => $self,
38 )
39 );
40}
41
42
# spent 3.29ms (720µs+2.57) within Class::MOP::Mixin::HasMethods::wrap_method_body which was called 66 times, avg 50µs/call: # 66 times (720µs+2.57ms) by Class::MOP::Mixin::HasMethods::get_method at line 124, avg 50µs/call
sub wrap_method_body {
4366110µs my ( $self, %args ) = @_;
44
456640µs ( 'CODE' eq ref $args{body} )
46 || confess "Your code block must be a CODE reference";
47
4866625µs1982.57ms $self->method_metaclass->wrap(
# spent 2.46ms making 66 calls to Class::MOP::Method::wrap, avg 37µs/call # spent 40µs making 15 calls to Moose::Meta::Role::method_metaclass, avg 3µs/call # spent 36µs making 66 calls to Class::MOP::Package::name, avg 552ns/call # spent 31µs making 51 calls to Class::MOP::Mixin::HasMethods::method_metaclass, avg 614ns/call
49 package_name => $self->name,
50 %args,
51 );
52}
53
54
# spent 26.2ms (10.2+16.0) within Class::MOP::Mixin::HasMethods::add_method which was called 390 times, avg 67µs/call: # 153 times (3.81ms+5.94ms) by Class::MOP::Attribute::install_accessors at line 428 of Class/MOP/Attribute.pm, avg 64µs/call # 51 times (1.40ms+2.35ms) by Class::MOP::Attribute::install_accessors at line 424 of Class/MOP/Attribute.pm, avg 74µs/call # 42 times (889µs+1.36ms) by Class::MOP::Attribute::install_accessors at line 436 of Class/MOP/Attribute.pm, avg 54µs/call # 35 times (1.21ms+1.65ms) by Class::MOP::Mixin::HasMethods::_add_meta_method at line 33, avg 82µs/call # 30 times (981µs+1.60ms) by Class::MOP::Class::_inline_constructor at line 1452 of Class/MOP/Class.pm, avg 86µs/call # 23 times (559µs+837µs) by Class::MOP::Class::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/Class/MOP/Class.pm:1072] at line 1070 of Class/MOP/Class.pm, avg 61µs/call # 15 times (524µs+982µs) by Moose::Meta::Role::Application::ToClass::apply_methods at line 173 of Moose/Meta/Role/Application/ToClass.pm, avg 100µs/call # 10 times (224µs+454µs) by Class::MOP::MiniTrait::apply at line 29 of Class/MOP/MiniTrait.pm, avg 68µs/call # 8 times (173µs+256µs) by Class::MOP::Attribute::install_accessors at line 432 of Class/MOP/Attribute.pm, avg 54µs/call # 7 times (127µs+208µs) by Moose::BEGIN@47 at line 30 of Moose/Meta/Attribute/Native.pm, avg 48µs/call # 3 times (48µs+72µs) by Moose::BEGIN@36 at line 318 of Moose/Meta/Role.pm, avg 40µs/call # 3 times (48µs+68µs) by Moose::BEGIN@36 at line 326 of Moose/Meta/Role.pm, avg 39µs/call # 3 times (48µs+68µs) by Moose::BEGIN@36 at line 345 of Moose/Meta/Role.pm, avg 39µs/call # 2 times (32µs+45µs) by Moose::BEGIN@36 at line 119 of Moose/Meta/Role.pm, avg 39µs/call # once (19µs+40µs) by Moose::Exporter::BEGIN@13 at line 486 of Class/MOP.pm # once (17µs+39µs) by Moose::BEGIN@36 at line 99 of Moose/Meta/Role.pm # once (16µs+24µs) by Moose::BEGIN@36 at line 104 of Moose/Meta/Role.pm # once (16µs+24µs) by Moose::BEGIN@36 at line 109 of Moose/Meta/Role.pm # once (16µs+23µs) by Moose::BEGIN@36 at line 124 of Moose/Meta/Role.pm
sub add_method {
55390265µs my ( $self, $method_name, $method ) = @_;
56390177µs ( defined $method_name && length $method_name )
57 || confess "You must define a method name";
58
593901.06ms390240µs my $package_name = $self->name;
# spent 240µs making 390 calls to Class::MOP::Package::name, avg 616ns/call
60
6139070µs my $body;
623901.02ms390305µs if ( blessed($method) ) {
# spent 305µs making 390 calls to Scalar::Util::blessed, avg 782ns/call
633671.05ms367249µs $body = $method->body;
# spent 249µs making 367 calls to Class::MOP::Method::body, avg 680ns/call
643671.03ms392674µs if ( $method->package_name ne $package_name ) {
# spent 431µs making 25 calls to Class::MOP::Method::clone, avg 17µs/call # spent 243µs making 367 calls to Class::MOP::Method::package_name, avg 663ns/call
65 $method = $method->clone(
66 package_name => $package_name,
67 name => $method_name,
68 );
69 }
70
71367598µs3671.66ms $method->attach_to_class($self);
# spent 1.66ms making 367 calls to Class::MOP::Method::attach_to_class, avg 5µs/call
72 }
73 else {
74 # If a raw code reference is supplied, its method object is not created.
75 # The method object won't be created until required.
76236µs $body = $method;
77 }
78
793902.38ms4131.36ms $self->_method_map->{$method_name} = $method;
# spent 1.35ms making 390 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 3µs/call # spent 14µs making 23 calls to Class::MOP::Method::body, avg 591ns/call
80
813901.36ms390480µs my ($current_package, $current_name) = Class::MOP::get_code_info($body);
# spent 480µs making 390 calls to Class::MOP::get_code_info, avg 1µs/call
82
833903.06ms6991.66ms subname($package_name . '::' . $method_name, $body)
# spent 1.03ms making 309 calls to Sub::Name::subname, avg 3µs/call # spent 634µs making 390 calls to Class::MOP::Mixin::HasMethods::CORE:match, avg 2µs/call
84 unless defined $current_name && $current_name !~ /^__ANON__/;
85
86390773µs3906.82ms $self->add_package_symbol("&$method_name", $body);
# spent 6.82ms making 390 calls to Class::MOP::Package::add_package_symbol, avg 17µs/call
87
88 # we added the method to the method map too, so it's still valid
893901.45ms3902.61ms $self->update_package_cache_flag;
# spent 2.61ms making 390 calls to Class::MOP::Mixin::HasMethods::update_package_cache_flag, avg 7µs/call
90}
91
92
# spent 902µs (693+209) within Class::MOP::Mixin::HasMethods::_code_is_mine which was called 125 times, avg 7µs/call: # 125 times (693µs+209µs) by Class::MOP::Mixin::HasMethods::_get_maybe_raw_method at line 139, avg 7µs/call
sub _code_is_mine {
9312553µs my ( $self, $code ) = @_;
94
95125396µs125136µs my ( $code_package, $code_name ) = Class::MOP::get_code_info($code);
# spent 136µs making 125 calls to Class::MOP::get_code_info, avg 1µs/call
96
97125553µs12573µs return ( $code_package && $code_package eq $self->name )
# spent 73µs making 125 calls to Class::MOP::Package::name, avg 582ns/call
98 || ( $code_package eq 'constant' && $code_name eq '__ANON__' );
99}
100
101
# spent 1.36ms (328µs+1.03) within Class::MOP::Mixin::HasMethods::has_method which was called 48 times, avg 28µs/call: # 30 times (197µs+791µs) by Class::MOP::Class::_inline_constructor at line 1424 of Class/MOP/Class.pm, avg 33µs/call # 9 times (58µs+127µs) by Moose::Meta::Attribute::_process_accessors at line 1066 of Moose/Meta/Attribute.pm, avg 21µs/call # 9 times (73µs+111µs) by Moose::Meta::Class::_inline_create_error at line 840 of Moose/Meta/Class.pm, avg 20µs/call
sub has_method {
1024837µs my ( $self, $method_name ) = @_;
103
1044824µs ( defined $method_name && length $method_name )
105 || confess "You must define a method name";
106
10748191µs481.02ms my $method = $self->_get_maybe_raw_method($method_name)
# spent 1.02ms making 48 calls to Class::MOP::Mixin::HasMethods::_get_maybe_raw_method, avg 21µs/call
108 or return;
109
1101058µs1011µs return defined($self->_method_map->{$method_name} = $method);
# spent 11µs making 10 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 1µs/call
111}
112
113
# spent 16.8ms (2.64+14.2) within Class::MOP::Mixin::HasMethods::get_method which was called 482 times, avg 35µs/call: # 232 times (1.00ms+5.32ms) by Class::MOP::Class::find_method_by_name at line 1123 of Class/MOP/Class.pm, avg 27µs/call # 98 times (721µs+5.02ms) by Class::MOP::Mixin::HasMethods::_full_method_map at line 205, avg 59µs/call # 90 times (524µs+2.06ms) by Class::MOP::Class::find_next_method_by_name at line 1171 of Class/MOP/Class.pm, avg 29µs/call # 23 times (68µs+350µs) by Class::MOP::Class::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/x86_64-linux/Class/MOP/Class.pm:1072] at line 1047 of Class/MOP/Class.pm, avg 18µs/call # 15 times (137µs+354µs) by Moose::Meta::Role::Application::ToClass::apply_methods at line 169 of Moose/Meta/Role/Application/ToClass.pm, avg 33µs/call # 9 times (84µs+459µs) by Moose::Meta::Attribute::_process_accessors at line 1039 of Moose/Meta/Attribute.pm, avg 60µs/call # 7 times (53µs+216µs) by Moose::init_meta at line 201 of Moose.pm, avg 38µs/call # 4 times (40µs+312µs) by Moose::Role::init_meta at line 142 of Moose/Role.pm, avg 88µs/call # 4 times (12µs+62µs) by Moose::Meta::Role::find_method_by_name at line 436 of Moose/Meta/Role.pm, avg 19µs/call
sub get_method {
114482332µs my ( $self, $method_name ) = @_;
115
116482150µs ( defined $method_name && length $method_name )
117 || confess "You must define a method name";
118
1194821.27ms48210.6ms my $method = $self->_get_maybe_raw_method($method_name)
# spent 10.6ms making 482 calls to Class::MOP::Mixin::HasMethods::_get_maybe_raw_method, avg 22µs/call
120 or return;
121
122131500µs131121µs return $method if blessed $method;
# spent 121µs making 131 calls to Scalar::Util::blessed, avg 926ns/call
123
12466510µs1323.44ms return $self->_method_map->{$method_name} = $self->wrap_method_body(
# spent 3.29ms making 66 calls to Class::MOP::Mixin::HasMethods::wrap_method_body, avg 50µs/call # spent 101µs making 59 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 2µs/call # spent 50µs making 7 calls to Class::MOP::Class::Immutable::Class::MOP::Class::_method_map, avg 7µs/call
125 body => $method,
126 name => $method_name,
127 associated_metaclass => $self,
128 );
129}
130
131
# spent 11.6ms (3.68+7.92) within Class::MOP::Mixin::HasMethods::_get_maybe_raw_method which was called 530 times, avg 22µs/call: # 482 times (3.32ms+7.27ms) by Class::MOP::Mixin::HasMethods::get_method at line 119, avg 22µs/call # 48 times (361µs+657µs) by Class::MOP::Mixin::HasMethods::has_method at line 107, avg 21µs/call
sub _get_maybe_raw_method {
132530226µs my ( $self, $method_name ) = @_;
133
1345302.80ms5552.45ms my $map_entry = $self->_method_map->{$method_name};
# spent 1.52ms making 450 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 3µs/call # spent 897µs making 80 calls to Class::MOP::Class::Immutable::Class::MOP::Class::_method_map, avg 11µs/call # spent 28µs making 25 calls to Class::MOP::Method::body, avg 1µs/call
135530255µs return $map_entry if defined $map_entry;
136
137456843µs4564.60ms my $code = $self->get_package_symbol("&$method_name");
# spent 4.60ms making 456 calls to Class::MOP::Package::get_package_symbol, avg 10µs/call
138
139456962µs125902µs return unless $code && $self->_code_is_mine($code);
# spent 902µs making 125 calls to Class::MOP::Mixin::HasMethods::_code_is_mine, avg 7µs/call
140
14167129µs return $code;
142}
143
144sub remove_method {
145 my ( $self, $method_name ) = @_;
146
147 ( defined $method_name && length $method_name )
148 || confess "You must define a method name";
149
150 my $removed_method = delete $self->_method_map->{$method_name};
151
152 $self->remove_package_symbol("&$method_name");
153
154 $removed_method->detach_from_class
155 if blessed($removed_method);
156
157 # still valid, since we just removed the method from the map
158 $self->update_package_cache_flag;
159
160 return $removed_method;
161}
162
163
# spent 1.47ms (31µs+1.44) within Class::MOP::Mixin::HasMethods::get_method_list which was called: # once (31µs+1.44ms) by namespace::autoclean::__ANON__[/2home/ss5/perl5/perlbrew/perls/perl-5.12.3/lib/site_perl/5.12.3/namespace/autoclean.pm:57] at line 45 of namespace/autoclean.pm
sub get_method_list {
1641900ns my $self = shift;
165
166132µs11.44ms return keys %{ $self->_full_method_map };
# spent 1.44ms making 1 call to Class::MOP::Mixin::HasMethods::_full_method_map
167}
168
169
# spent 5.25ms (110µs+5.14) within Class::MOP::Mixin::HasMethods::_get_local_methods which was called 18 times, avg 292µs/call: # 14 times (74µs+2.18ms) by Class::MOP::Class::get_all_methods at line 1136 of Class/MOP/Class.pm, avg 161µs/call # 4 times (36µs+2.96ms) by Moose::Meta::Role::Application::ToClass::apply_methods at line 162 of Moose/Meta/Role/Application/ToClass.pm, avg 748µs/call
sub _get_local_methods {
170187µs my $self = shift;
171
17218100µs185.14ms return values %{ $self->_full_method_map };
# spent 5.14ms making 18 calls to Class::MOP::Mixin::HasMethods::_full_method_map, avg 285µs/call
173}
174
175sub _restore_metamethods_from {
176 my $self = shift;
177 my ($old_meta) = @_;
178
179 for my $method ($old_meta->_get_local_methods) {
180 $method->_make_compatible_with($self->method_metaclass);
181 $self->add_method($method->name => $method);
182 }
183}
184
185418µs
# spent 11µs within Class::MOP::Mixin::HasMethods::reset_package_cache_flag which was called 4 times, avg 3µs/call: # 4 times (11µs+0s) by Moose::Meta::Role::Application::ToClass::apply_methods at line 200 of Moose/Meta/Role/Application/ToClass.pm, avg 3µs/call
sub reset_package_cache_flag { (shift)->{'_package_cache_flag'} = undef }
186
# spent 2.61ms (1.80+805µs) within Class::MOP::Mixin::HasMethods::update_package_cache_flag which was called 390 times, avg 7µs/call: # 390 times (1.80ms+805µs) by Class::MOP::Mixin::HasMethods::add_method at line 89, avg 7µs/call
sub update_package_cache_flag {
187390140µs my $self = shift;
188 # NOTE:
189 # we can manually update the cache number
190 # since we are actually adding the method
191 # to our cache as well. This avoids us
192 # having to regenerate the method_map.
193 # - SL
1943902.68ms780805µs $self->{'_package_cache_flag'} = Class::MOP::check_package_cache_flag($self->name);
# spent 603µs making 390 calls to mro::get_pkg_gen, avg 2µs/call # spent 202µs making 390 calls to Class::MOP::Package::name, avg 519ns/call
195}
196
197
# spent 6.58ms (534µs+6.04) within Class::MOP::Mixin::HasMethods::_full_method_map which was called 19 times, avg 346µs/call: # 18 times (446µs+4.69ms) by Class::MOP::Mixin::HasMethods::_get_local_methods at line 172, avg 285µs/call # once (88µs+1.35ms) by Class::MOP::Mixin::HasMethods::get_method_list at line 166
sub _full_method_map {
198198µs my $self = shift;
199
20019165µs3864µs my $pkg_gen = Class::MOP::check_package_cache_flag($self->name);
# spent 46µs making 19 calls to mro::get_pkg_gen, avg 2µs/call # spent 17µs making 19 calls to Class::MOP::Package::name, avg 895ns/call
201
2021927µs if (($self->{_package_cache_flag_full} || -1) != $pkg_gen) {
203 # forcibly reify all method map entries
204 $self->get_method($_)
20516212µs1065.94ms for $self->list_all_package_symbols('CODE');
# spent 5.74ms making 98 calls to Class::MOP::Mixin::HasMethods::get_method, avg 59µs/call # spent 200µs making 8 calls to Class::MOP::Package::list_all_package_symbols, avg 25µs/call
206810µs $self->{_package_cache_flag_full} = $pkg_gen;
207 }
208
20919143µs1941µs return $self->_method_map;
# spent 41µs making 19 calls to Class::MOP::Mixin::HasMethods::_method_map, avg 2µs/call
210}
211
212# overloading
213
2141200nsmy $overload_operators;
215sub overload_operators {
216 $overload_operators ||= [map { split /\s+/ } values %overload::ops];
217 return @$overload_operators;
218}
219
220sub is_overloaded {
221 my $self = shift;
222 return overload::Overloaded($self->name);
223}
224
225# XXX this could probably stand to be cached, but i figure it should be
226# uncommon enough to not particularly matter
227sub _overload_map {
228 my $self = shift;
229
230 return {} unless $self->is_overloaded;
231
232 my %map;
233 for my $op ($self->overload_operators) {
234 my $body = $self->_get_overloaded_operator_body($op);
235 next unless defined $body;
236 $map{$op} = $body;
237 }
238
239 return \%map;
240}
241
242sub get_overload_list {
243 my $self = shift;
244 return keys %{ $self->_overload_map };
245}
246
247sub get_all_overloaded_operators {
248 my $self = shift;
249 my $map = $self->_overload_map;
250 return map { $self->_wrap_overload($_, $map->{$_}) } keys %$map;
251}
252
253sub has_overloaded_operator {
254 my $self = shift;
255 my ($op) = @_;
256 return defined $self->_get_overloaded_operator_body($op);
257}
258
259sub get_overloaded_operator {
260 my $self = shift;
261 my ($op) = @_;
262 my $body = $self->_get_overloaded_operator_body($op);
263 return unless defined $body;
264 return $self->_wrap_overload($op, $body);
265}
266
267sub add_overloaded_operator {
268 my $self = shift;
269 my ($op, $body) = @_;
270 $self->name->overload::OVERLOAD($op => $body);
271}
272
273sub remove_overloaded_operator {
274 my $self = shift;
275 my ($op) = @_;
276 # ugh, overload.pm provides no api for this
277 $self->get_or_add_package_symbol('%OVERLOAD')->{dummy}++;
278 $self->remove_package_symbol('&(' . $op);
279}
280
281sub _get_overloaded_operator_body {
282 my $self = shift;
283 my ($op) = @_;
284 return overload::Method($self->name, $op);
285}
286
287sub _wrap_overload {
288 my $self = shift;
289 my ($op, $body) = @_;
290 return Class::MOP::Method::Overload->wrap(
291 operator => $op,
292 package_name => $self->name,
293 associated_metaclass => $self,
294 body => $body,
295 );
296}
297
29813µs1;
299
300# ABSTRACT: Methods for metaclasses which have methods
301
- -
304=pod
305
306=head1 NAME
307
308Class::MOP::Mixin::HasMethods - Methods for metaclasses which have methods
309
310=head1 VERSION
311
312version 2.0602
313
314=head1 DESCRIPTION
315
316This class implements methods for metaclasses which have methods
317(L<Class::MOP::Package> and L<Moose::Meta::Role>). See L<Class::MOP::Package>
318for API details.
319
320=head1 AUTHOR
321
322Moose is maintained by the Moose Cabal, along with the help of many contributors. See L<Moose/CABAL> and L<Moose/CONTRIBUTORS> for details.
323
324=head1 COPYRIGHT AND LICENSE
325
326This software is copyright (c) 2012 by Infinity Interactive, Inc..
327
328This is free software; you can redistribute it and/or modify it under
329the same terms as the Perl 5 programming language system itself.
330
331=cut
332
333
334__END__
 
# spent 634µs within Class::MOP::Mixin::HasMethods::CORE:match which was called 390 times, avg 2µs/call: # 390 times (634µs+0s) by Class::MOP::Mixin::HasMethods::add_method at line 83, avg 2µs/call
sub Class::MOP::Mixin::HasMethods::CORE:match; # opcode