| Filename | /home/doy/coding/src/Moose/blib/lib//Moose/Meta/Role/Composite.pm |
| Statements | Executed 443 statements in 10.1ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 49 | 1 | 1 | 5.43ms | 11.6ms | Moose::Meta::Role::Composite::add_method |
| 3 | 1 | 1 | 620µs | 2.36ms | Moose::Meta::Role::Composite::new |
| 3 | 1 | 1 | 309µs | 72.1ms | Moose::Meta::Role::Composite::apply_params |
| 6 | 2 | 2 | 150µs | 207µs | Moose::Meta::Role::Composite::has_method |
| 3 | 2 | 2 | 110µs | 151µs | Moose::Meta::Role::Composite::_get_local_methods |
| 1 | 1 | 1 | 75µs | 94µs | Moose::Meta::Role::Composite::BEGIN@3 |
| 1 | 1 | 1 | 43µs | 207µs | Moose::Meta::Role::Composite::BEGIN@7 |
| 1 | 1 | 1 | 40µs | 302µs | Moose::Meta::Role::Composite::BEGIN@13 |
| 1 | 1 | 1 | 38µs | 106µs | Moose::Meta::Role::Composite::BEGIN@4 |
| 1 | 1 | 1 | 38µs | 2.96ms | Moose::Meta::Role::Composite::BEGIN@5 |
| 3 | 1 | 1 | 30µs | 30µs | Moose::Meta::Role::Composite::__ANON__[:30] |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Role::Composite::get_method |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Role::Composite::get_method_list |
| 0 | 0 | 0 | 0s | 0s | Moose::Meta::Role::Composite::reinitialize |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Moose::Meta::Role::Composite; | ||||
| 2 | |||||
| 3 | 3 | 100µs | 2 | 112µs | # spent 94µs (75+19) within Moose::Meta::Role::Composite::BEGIN@3 which was called:
# once (75µs+19µs) by Moose::BEGIN@28 at line 3 # spent 94µs making 1 call to Moose::Meta::Role::Composite::BEGIN@3
# spent 19µs making 1 call to strict::import |
| 4 | 3 | 92µs | 2 | 174µs | # spent 106µs (38+68) within Moose::Meta::Role::Composite::BEGIN@4 which was called:
# once (38µs+68µs) by Moose::BEGIN@28 at line 4 # spent 106µs making 1 call to Moose::Meta::Role::Composite::BEGIN@4
# spent 68µs making 1 call to warnings::import |
| 5 | 3 | 146µs | 2 | 5.87ms | # spent 2.96ms (38µs+2.92) within Moose::Meta::Role::Composite::BEGIN@5 which was called:
# once (38µs+2.92ms) by Moose::BEGIN@28 at line 5 # spent 2.96ms making 1 call to Moose::Meta::Role::Composite::BEGIN@5
# spent 2.92ms making 1 call to metaclass::import |
| 6 | |||||
| 7 | 3 | 247µs | 2 | 372µs | # spent 207µs (43+165) within Moose::Meta::Role::Composite::BEGIN@7 which was called:
# once (43µs+165µs) by Moose::BEGIN@28 at line 7 # spent 207µs making 1 call to Moose::Meta::Role::Composite::BEGIN@7
# spent 165µs making 1 call to Exporter::import |
| 8 | |||||
| 9 | 1 | 5µs | our $VERSION = '1.19'; | ||
| 10 | 1 | 59µs | $VERSION = eval $VERSION; # spent 12µs executing statements in string eval | ||
| 11 | 1 | 4µs | our $AUTHORITY = 'cpan:STEVAN'; | ||
| 12 | |||||
| 13 | 3 | 2.06ms | 2 | 563µs | # spent 302µs (40+261) within Moose::Meta::Role::Composite::BEGIN@13 which was called:
# once (40µs+261µs) by Moose::BEGIN@28 at line 13 # spent 302µs making 1 call to Moose::Meta::Role::Composite::BEGIN@13
# spent 261µs making 1 call to base::import |
| 14 | |||||
| 15 | # NOTE: | ||||
| 16 | # we need to override the ->name | ||||
| 17 | # method from Class::MOP::Package | ||||
| 18 | # since we don't have an actual | ||||
| 19 | # package for this. | ||||
| 20 | # - SL | ||||
| 21 | 1 | 28µs | 2 | 2.26ms | __PACKAGE__->meta->add_attribute('name' => (reader => 'name')); # spent 2.14ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 120µs making 1 call to Moose::Meta::Role::Composite::meta |
| 22 | |||||
| 23 | # NOTE: | ||||
| 24 | # Again, since we don't have a real | ||||
| 25 | # package to store our methods in, | ||||
| 26 | # we use a HASH ref instead. | ||||
| 27 | # - SL | ||||
| 28 | __PACKAGE__->meta->add_attribute('_methods' => ( | ||||
| 29 | reader => '_method_map', | ||||
| 30 | 3 | 44µs | # spent 30µs within Moose::Meta::Role::Composite::__ANON__[/home/doy/coding/src/Moose/blib/lib//Moose/Meta/Role/Composite.pm:30] which was called 3 times, avg 10µs/call:
# 3 times (30µs+0s) by Moose::Meta::Role::Composite::_new at line 12 of generated method (unknown origin), avg 10µs/call | ||
| 31 | 1 | 31µs | 2 | 2.09ms | )); # spent 2.00ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 88µs making 1 call to Moose::Meta::Role::Composite::meta |
| 32 | |||||
| 33 | 1 | 24µs | 2 | 1.98ms | __PACKAGE__->meta->add_attribute( # spent 1.89ms making 1 call to Class::MOP::Mixin::HasAttributes::add_attribute
# spent 87µs making 1 call to Moose::Meta::Role::Composite::meta |
| 34 | 'application_role_summation_class', | ||||
| 35 | reader => 'application_role_summation_class', | ||||
| 36 | default => 'Moose::Meta::Role::Application::RoleSummation', | ||||
| 37 | ); | ||||
| 38 | |||||
| 39 | # spent 2.36ms (620µs+1.74) within Moose::Meta::Role::Composite::new which was called 3 times, avg 787µs/call:
# 3 times (620µs+1.74ms) by Moose::Meta::Role::combine at line 508 of Moose/Meta/Role.pm, avg 787µs/call | ||||
| 40 | 45 | 677µs | my ($class, %params) = @_; | ||
| 41 | |||||
| 42 | # the roles param is required ... | ||||
| 43 | foreach ( @{$params{roles}} ) { | ||||
| 44 | 9 | 45µs | unless ( $_->isa('Moose::Meta::Role') ) { # spent 45µs making 9 calls to UNIVERSAL::isa, avg 5µs/call | ||
| 45 | require Moose; | ||||
| 46 | Moose->throw_error("The list of roles must be instances of Moose::Meta::Role, not $_"); | ||||
| 47 | } | ||||
| 48 | } | ||||
| 49 | |||||
| 50 | 9 | 57µs | my @composition_roles = map { # spent 57µs making 9 calls to Moose::Meta::Role::composition_class_roles, avg 6µs/call | ||
| 51 | $_->composition_class_roles | ||||
| 52 | } @{ $params{roles} }; | ||||
| 53 | |||||
| 54 | if (@composition_roles) { | ||||
| 55 | my $meta = Moose::Meta::Class->create_anon_class( | ||||
| 56 | superclasses => [ $class ], | ||||
| 57 | roles => [ @composition_roles ], | ||||
| 58 | cache => 1, | ||||
| 59 | ); | ||||
| 60 | $class = $meta->name; | ||||
| 61 | } | ||||
| 62 | |||||
| 63 | # and the name is created from the | ||||
| 64 | # roles if one has not been provided | ||||
| 65 | 9 | 47µs | $params{name} ||= (join "|" => map { $_->name } @{$params{roles}}); # spent 47µs making 9 calls to Class::MOP::Package::name, avg 5µs/call | ||
| 66 | 3 | 1.59ms | $class->_new(\%params); # spent 1.59ms making 3 calls to Moose::Meta::Role::Composite::_new, avg 531µs/call | ||
| 67 | } | ||||
| 68 | |||||
| 69 | # This is largely a cope of what's in Moose::Meta::Role (itself | ||||
| 70 | # largely a copy of Class::MOP::Class). However, we can't actually | ||||
| 71 | # call add_package_symbol, because there's no package to which which | ||||
| 72 | # add the symbol. | ||||
| 73 | # spent 11.6ms (5.43+6.21) within Moose::Meta::Role::Composite::add_method which was called 49 times, avg 238µs/call:
# 49 times (5.43ms+6.21ms) by Moose::Meta::Role::Application::RoleSummation::apply_methods at line 200 of Moose/Meta/Role/Application/RoleSummation.pm, avg 238µs/call | ||||
| 74 | 343 | 5.95ms | my ($self, $method_name, $method) = @_; | ||
| 75 | |||||
| 76 | unless ( defined $method_name && $method_name ) { | ||||
| 77 | Moose->throw_error("You must define a method name"); | ||||
| 78 | } | ||||
| 79 | |||||
| 80 | my $body; | ||||
| 81 | 49 | 256µs | if (blessed($method)) { # spent 256µs making 49 calls to Scalar::Util::blessed, avg 5µs/call | ||
| 82 | 49 | 254µs | $body = $method->body; # spent 254µs making 49 calls to Class::MOP::Method::body, avg 5µs/call | ||
| 83 | 245 | 5.15ms | if ($method->package_name ne $self->name) { # spent 3.46ms making 49 calls to Class::MOP::Method::clone, avg 71µs/call
# spent 1.14ms making 98 calls to Moose::Meta::Role::Composite::name, avg 12µs/call
# spent 315µs making 49 calls to UNIVERSAL::can, avg 6µs/call
# spent 233µs making 49 calls to Class::MOP::Method::package_name, avg 5µs/call | ||
| 84 | $method = $method->clone( | ||||
| 85 | package_name => $self->name, | ||||
| 86 | name => $method_name | ||||
| 87 | ) if $method->can('clone'); | ||||
| 88 | } | ||||
| 89 | } | ||||
| 90 | else { | ||||
| 91 | $body = $method; | ||||
| 92 | $method = $self->wrap_method_body( body => $body, name => $method_name ); | ||||
| 93 | } | ||||
| 94 | |||||
| 95 | 49 | 551µs | $self->_method_map->{$method_name} = $method; # spent 551µs making 49 calls to Moose::Meta::Role::Composite::_method_map, avg 11µs/call | ||
| 96 | } | ||||
| 97 | |||||
| 98 | sub get_method_list { | ||||
| 99 | my $self = shift; | ||||
| 100 | return keys %{ $self->_method_map }; | ||||
| 101 | } | ||||
| 102 | |||||
| 103 | # spent 151µs (110+41) within Moose::Meta::Role::Composite::_get_local_methods which was called 3 times, avg 50µs/call:
# 2 times (75µs+27µs) by Moose::Meta::Role::Application::ToRole::apply_methods at line 80 of Moose/Meta/Role/Application/ToRole.pm, avg 51µs/call
# once (35µs+14µs) by Moose::Meta::Role::Application::ToClass::apply_methods at line 152 of Moose/Meta/Role/Application/ToClass.pm | ||||
| 104 | 6 | 115µs | my $self = shift; | ||
| 105 | 3 | 41µs | return values %{ $self->_method_map }; # spent 41µs making 3 calls to Moose::Meta::Role::Composite::_method_map, avg 14µs/call | ||
| 106 | } | ||||
| 107 | |||||
| 108 | # spent 207µs (150+57) within Moose::Meta::Role::Composite::has_method which was called 6 times, avg 34µs/call:
# 3 times (81µs+28µs) by Moose::Meta::Role::Application::RoleSummation::apply_override_method_modifiers at line 218 of Moose/Meta/Role/Application/RoleSummation.pm, avg 37µs/call
# 3 times (69µs+28µs) by Moose::Meta::Role::add_override_method_modifier at line 358 of Moose/Meta/Role.pm, avg 32µs/call | ||||
| 109 | 12 | 144µs | my ($self, $method_name) = @_; | ||
| 110 | |||||
| 111 | 6 | 57µs | return exists $self->_method_map->{$method_name}; # spent 57µs making 6 calls to Moose::Meta::Role::Composite::_method_map, avg 9µs/call | ||
| 112 | } | ||||
| 113 | |||||
| 114 | sub get_method { | ||||
| 115 | my ($self, $method_name) = @_; | ||||
| 116 | |||||
| 117 | return $self->_method_map->{$method_name}; | ||||
| 118 | } | ||||
| 119 | |||||
| 120 | # spent 72.1ms (309µs+71.8) within Moose::Meta::Role::Composite::apply_params which was called 3 times, avg 24.0ms/call:
# 3 times (309µs+71.8ms) by Moose::Meta::Role::combine at line 509 of Moose/Meta/Role.pm, avg 24.0ms/call | ||||
| 121 | 12 | 263µs | my ($self, $role_params) = @_; | ||
| 122 | 6 | 293µs | Class::MOP::load_class($self->application_role_summation_class); # spent 745µs making 3 calls to Class::MOP::load_class, avg 248µs/call, recursion: max depth 2, sum of overlapping time 498µs
# spent 46µs making 3 calls to Moose::Meta::Role::Composite::application_role_summation_class, avg 15µs/call | ||
| 123 | |||||
| 124 | 9 | 71.0ms | $self->application_role_summation_class->new( # spent 70.4ms making 3 calls to Moose::Meta::Role::Application::apply, avg 23.5ms/call
# spent 545µs making 3 calls to Moose::Meta::Role::Application::new, avg 182µs/call
# spent 39µs making 3 calls to Moose::Meta::Role::Composite::application_role_summation_class, avg 13µs/call | ||
| 125 | role_params => $role_params, | ||||
| 126 | )->apply($self); | ||||
| 127 | |||||
| 128 | return $self; | ||||
| 129 | } | ||||
| 130 | |||||
| 131 | sub reinitialize { | ||||
| 132 | my ( $class, $old_meta, @args ) = @_; | ||||
| 133 | |||||
| 134 | Moose->throw_error( | ||||
| 135 | 'Moose::Meta::Role::Composite instances can only be reinitialized from an existing metaclass instance' | ||||
| 136 | ) | ||||
| 137 | if !blessed $old_meta | ||||
| 138 | || !$old_meta->isa('Moose::Meta::Role::Composite'); | ||||
| 139 | |||||
| 140 | my %existing_classes = map { $_ => $old_meta->$_() } qw( | ||||
| 141 | application_role_summation_class | ||||
| 142 | ); | ||||
| 143 | |||||
| 144 | return $old_meta->meta->clone_object( $old_meta, %existing_classes, @args ); | ||||
| 145 | } | ||||
| 146 | |||||
| 147 | 1 | 69µs | 1; | ||
| 148 | |||||
| 149 | __END__ |