| Filename | /usr/share/perl5/Moo.pm |
| Statements | Executed 0 statements in 0s |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 10.2ms | 10.3ms | Moo::BEGIN@3 |
| 1 | 1 | 1 | 540µs | 602µs | Moo::BEGIN@5 |
| 2 | 2 | 2 | 188µs | 784µs | Moo::import |
| 7 | 7 | 1 | 161µs | 7.53ms | Moo::has |
| 8 | 2 | 2 | 134µs | 1.76ms | Moo::_constructor_maker_for |
| 9 | 2 | 1 | 59µs | 107µs | Moo::_accessor_maker_for |
| 12 | 4 | 1 | 54µs | 211µs | Moo::_install_tracked |
| 1 | 1 | 1 | 15µs | 84µs | Moo::BEGIN@4 |
| 7 | 1 | 1 | 13µs | 13µs | Moo::_maybe_reset_handlemoose |
| 1 | 1 | 1 | 12µs | 21µs | Moo::BEGIN@73 |
| 1 | 1 | 1 | 11µs | 26µs | Moo::BEGIN@108 |
| 1 | 1 | 1 | 9µs | 16µs | Moo::__ANON__[:183] |
| 0 | 0 | 0 | 0s | 0s | Moo::__ANON__[:33] |
| 0 | 0 | 0 | 0s | 0s | Moo::__ANON__[:38] |
| 0 | 0 | 0 | 0s | 0s | Moo::__ANON__[:59] |
| 0 | 0 | 0 | 0s | 0s | Moo::__ANON__[:65] |
| 0 | 0 | 0 | 0s | 0s | Moo::_concrete_methods_of |
| 0 | 0 | 0 | 0s | 0s | Moo::_set_superclasses |
| 0 | 0 | 0 | 0s | 0s | Moo::after |
| 0 | 0 | 0 | 0s | 0s | Moo::around |
| 0 | 0 | 0 | 0s | 0s | Moo::before |
| 0 | 0 | 0 | 0s | 0s | Moo::extends |
| 0 | 0 | 0 | 0s | 0s | Moo::unimport |
| 0 | 0 | 0 | 0s | 0s | Moo::with |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Moo; | ||||
| 2 | |||||
| 3 | 3 | 10.3ms | # spent 10.3ms (10.2+82µs) within Moo::BEGIN@3 which was called:
# once (10.2ms+82µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 3 # spent 10.3ms making 1 call to Moo::BEGIN@3
# spent 58µs making 1 call to strictures::import
# spent 25µs making 1 call to strictures::VERSION | ||
| 4 | 2 | 152µs | # spent 84µs (15+69) within Moo::BEGIN@4 which was called:
# once (15µs+69µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 4 # spent 84µs making 1 call to Moo::BEGIN@4
# spent 69µs making 1 call to Exporter::import | ||
| 5 | 1 | 602µs | # spent 602µs (540+62) within Moo::BEGIN@5 which was called:
# once (540µs+62µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 5 # spent 602µs making 1 call to Moo::BEGIN@5 | ||
| 6 | |||||
| 7 | our $VERSION = '1.006001'; | ||||
| 8 | $VERSION = eval $VERSION; # spent 0s executing statements in string eval | ||||
| 9 | |||||
| 10 | require Moo::sification; | ||||
| 11 | |||||
| 12 | our %MAKERS; | ||||
| 13 | |||||
| 14 | # spent 211µs (54+156) within Moo::_install_tracked which was called 12 times, avg 18µs/call:
# 6 times (21µs+66µs) by Moo::import at line 65, avg 15µs/call
# 2 times (16µs+44µs) by Moo::import at line 33, avg 30µs/call
# 2 times (10µs+22µs) by Moo::import at line 59, avg 16µs/call
# 2 times (7µs+24µs) by Moo::import at line 38, avg 16µs/call | ||||
| 15 | my ($target, $name, $code) = @_; | ||||
| 16 | $MAKERS{$target}{exports}{$name} = $code; | ||||
| 17 | 12 | 156µs | _install_coderef "${target}::${name}" => "Moo::${name}" => $code; # spent 156µs making 12 calls to Moo::_Utils::_install_coderef, avg 13µs/call | ||
| 18 | } | ||||
| 19 | |||||
| 20 | # spent 784µs (188+595) within Moo::import which was called 2 times, avg 392µs/call:
# once (114µs+307µs) by Method::Generate::Constructor::BEGIN@202 at line 202 of Method/Generate/Constructor.pm
# once (74µs+288µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 29 of DBIx/Class/Storage/BlockRunner.pm | ||||
| 21 | my $target = caller; | ||||
| 22 | my $class = shift; | ||||
| 23 | 2 | 48µs | _set_loaded(caller); # spent 48µs making 2 calls to Moo::_Utils::_set_loaded, avg 24µs/call | ||
| 24 | 2 | 332µs | strictures->import::into(1); # spent 332µs making 2 calls to import::into, avg 166µs/call | ||
| 25 | if ($INC{'Role/Tiny.pm'} and Role::Tiny->is_role($target)) { | ||||
| 26 | die "Cannot import Moo into a role"; | ||||
| 27 | } | ||||
| 28 | $MAKERS{$target} ||= {}; | ||||
| 29 | _install_tracked $target => extends => sub { | ||||
| 30 | $class->_set_superclasses($target, @_); | ||||
| 31 | $class->_maybe_reset_handlemoose($target); | ||||
| 32 | return; | ||||
| 33 | 2 | 60µs | }; # spent 60µs making 2 calls to Moo::_install_tracked, avg 30µs/call | ||
| 34 | _install_tracked $target => with => sub { | ||||
| 35 | require Moo::Role; | ||||
| 36 | Moo::Role->apply_roles_to_package($target, @_); | ||||
| 37 | $class->_maybe_reset_handlemoose($target); | ||||
| 38 | 2 | 31µs | }; # spent 31µs making 2 calls to Moo::_install_tracked, avg 16µs/call | ||
| 39 | # spent 7.53ms (161µs+7.37) within Moo::has which was called 7 times, avg 1.08ms/call:
# once (23µs+4.53ms) by DBIx::Class::Storage::BEGIN@16 at line 78 of DBIx/Class/Storage/BlockRunner.pm
# once (39µs+1.78ms) by DBIx::Class::Storage::BEGIN@16 at line 46 of DBIx/Class/Storage/BlockRunner.pm
# once (31µs+455µs) by DBIx::Class::Storage::BEGIN@16 at line 92 of DBIx/Class/Storage/BlockRunner.pm
# once (15µs+292µs) by DBIx::Class::Storage::BEGIN@16 at line 66 of DBIx/Class/Storage/BlockRunner.pm
# once (21µs+117µs) by DBIx::Class::Storage::BEGIN@16 at line 57 of DBIx/Class/Storage/BlockRunner.pm
# once (18µs+98µs) by DBIx::Class::Storage::BEGIN@16 at line 51 of DBIx/Class/Storage/BlockRunner.pm
# once (14µs+100µs) by DBIx::Class::Storage::BEGIN@16 at line 73 of DBIx/Class/Storage/BlockRunner.pm | ||||
| 40 | my $name_proto = shift; | ||||
| 41 | my @name_proto = ref $name_proto eq 'ARRAY' ? @$name_proto : $name_proto; | ||||
| 42 | if (@_ % 2 != 0) { | ||||
| 43 | require Carp; | ||||
| 44 | Carp::croak("Invalid options for " . join(', ', map "'$_'", @name_proto) | ||||
| 45 | . " attribute(s): even number of arguments expected, got " . scalar @_) | ||||
| 46 | } | ||||
| 47 | my %spec = @_; | ||||
| 48 | foreach my $name (@name_proto) { | ||||
| 49 | # Note that when multiple attributes specified, each attribute | ||||
| 50 | # needs a separate \%specs hashref | ||||
| 51 | my $spec_ref = @name_proto > 1 ? +{%spec} : \%spec; | ||||
| 52 | 14 | 1.64ms | $class->_constructor_maker_for($target) # spent 1.58ms making 7 calls to Moo::_constructor_maker_for, avg 225µs/call
# spent 66µs making 7 calls to Method::Generate::Constructor::register_attribute_specs, avg 9µs/call | ||
| 53 | ->register_attribute_specs($name, $spec_ref); | ||||
| 54 | 14 | 5.72ms | $class->_accessor_maker_for($target) # spent 5.70ms making 7 calls to Method::Generate::Accessor::generate_method, avg 815µs/call
# spent 14µs making 7 calls to Moo::_accessor_maker_for, avg 2µs/call | ||
| 55 | ->generate_method($target, $name, $spec_ref); | ||||
| 56 | 7 | 13µs | $class->_maybe_reset_handlemoose($target); # spent 13µs making 7 calls to Moo::_maybe_reset_handlemoose, avg 2µs/call | ||
| 57 | } | ||||
| 58 | return; | ||||
| 59 | 2 | 32µs | }; # spent 32µs making 2 calls to Moo::_install_tracked, avg 16µs/call | ||
| 60 | foreach my $type (qw(before after around)) { | ||||
| 61 | _install_tracked $target => $type => sub { | ||||
| 62 | require Class::Method::Modifiers; | ||||
| 63 | _install_modifier($target, $type, @_); | ||||
| 64 | return; | ||||
| 65 | 6 | 88µs | }; # spent 88µs making 6 calls to Moo::_install_tracked, avg 15µs/call | ||
| 66 | } | ||||
| 67 | return if $MAKERS{$target}{is_class}; # already exported into this package | ||||
| 68 | 2 | 5µs | my $stash = _getstash($target); # spent 5µs making 2 calls to Moo::_Utils::_getstash, avg 2µs/call | ||
| 69 | my @not_methods = map { *$_{CODE}||() } grep !ref($_), values %$stash; | ||||
| 70 | @{$MAKERS{$target}{not_methods}={}}{@not_methods} = @not_methods; | ||||
| 71 | $MAKERS{$target}{is_class} = 1; | ||||
| 72 | { | ||||
| 73 | 2 | 30µs | # spent 21µs (12+9) within Moo::BEGIN@73 which was called:
# once (12µs+9µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 73 # spent 21µs making 1 call to Moo::BEGIN@73
# spent 9µs making 1 call to strict::unimport | ||
| 74 | @{"${target}::ISA"} = do { | ||||
| 75 | require Moo::Object; ('Moo::Object'); | ||||
| 76 | } unless @{"${target}::ISA"}; | ||||
| 77 | } | ||||
| 78 | if ($INC{'Moo/HandleMoose.pm'}) { | ||||
| 79 | Moo::HandleMoose::inject_fake_metaclass_for($target); | ||||
| 80 | } | ||||
| 81 | } | ||||
| 82 | |||||
| 83 | sub unimport { | ||||
| 84 | my $target = caller; | ||||
| 85 | _unimport_coderefs($target, $MAKERS{$target}); | ||||
| 86 | } | ||||
| 87 | |||||
| 88 | sub _set_superclasses { | ||||
| 89 | my $class = shift; | ||||
| 90 | my $target = shift; | ||||
| 91 | foreach my $superclass (@_) { | ||||
| 92 | _load_module($superclass); | ||||
| 93 | if ($INC{'Role/Tiny.pm'} && Role::Tiny->is_role($superclass)) { | ||||
| 94 | require Carp; | ||||
| 95 | Carp::croak("Can't extend role '$superclass'"); | ||||
| 96 | } | ||||
| 97 | } | ||||
| 98 | # Can't do *{...} = \@_ or 5.10.0's mro.pm stops seeing @ISA | ||||
| 99 | @{*{_getglob("${target}::ISA")}{ARRAY}} = @_; | ||||
| 100 | if (my $old = delete $Moo::MAKERS{$target}{constructor}) { | ||||
| 101 | delete _getstash($target)->{new}; | ||||
| 102 | Moo->_constructor_maker_for($target) | ||||
| 103 | ->register_attribute_specs(%{$old->all_attribute_specs}); | ||||
| 104 | } | ||||
| 105 | elsif (!$target->isa('Moo::Object')) { | ||||
| 106 | Moo->_constructor_maker_for($target); | ||||
| 107 | } | ||||
| 108 | 2 | 41µs | # spent 26µs (11+15) within Moo::BEGIN@108 which was called:
# once (11µs+15µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 108 # spent 26µs making 1 call to Moo::BEGIN@108
# spent 15µs making 1 call to warnings::unimport | ||
| 109 | $Moo::HandleMoose::MOUSE{$target} = [ | ||||
| 110 | grep defined, map Mouse::Util::find_meta($_), @_ | ||||
| 111 | ] if Mouse::Util->can('find_meta'); | ||||
| 112 | } | ||||
| 113 | |||||
| 114 | # spent 13µs within Moo::_maybe_reset_handlemoose which was called 7 times, avg 2µs/call:
# 7 times (13µs+0s) by Moo::has at line 56, avg 2µs/call | ||||
| 115 | my ($class, $target) = @_; | ||||
| 116 | if ($INC{"Moo/HandleMoose.pm"}) { | ||||
| 117 | Moo::HandleMoose::maybe_reinject_fake_metaclass_for($target); | ||||
| 118 | } | ||||
| 119 | } | ||||
| 120 | |||||
| 121 | sub _accessor_maker_for { | ||||
| 122 | my ($class, $target) = @_; | ||||
| 123 | return unless $MAKERS{$target}; | ||||
| 124 | $MAKERS{$target}{accessor} ||= do { | ||||
| 125 | my $maker_class = do { | ||||
| 126 | if (my $m = do { | ||||
| 127 | require Sub::Defer; | ||||
| 128 | 4 | 12µs | if (my $defer_target = # spent 8µs making 2 calls to Sub::Defer::defer_info, avg 4µs/call
# spent 4µs making 2 calls to UNIVERSAL::can, avg 2µs/call | ||
| 129 | (Sub::Defer::defer_info($target->can('new'))||[])->[0] | ||||
| 130 | ) { | ||||
| 131 | my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/); | ||||
| 132 | $MAKERS{$pkg} && $MAKERS{$pkg}{accessor}; | ||||
| 133 | } else { | ||||
| 134 | undef; | ||||
| 135 | } | ||||
| 136 | }) { | ||||
| 137 | ref($m); | ||||
| 138 | } else { | ||||
| 139 | require Method::Generate::Accessor; | ||||
| 140 | 'Method::Generate::Accessor' | ||||
| 141 | } | ||||
| 142 | }; | ||||
| 143 | 2 | 36µs | $maker_class->new; # spent 36µs making 2 calls to Moo::Object::new, avg 18µs/call | ||
| 144 | } | ||||
| 145 | } | ||||
| 146 | |||||
| 147 | # spent 1.76ms (134µs+1.63) within Moo::_constructor_maker_for which was called 8 times, avg 220µs/call:
# 7 times (77µs+1.50ms) by Moo::has at line 52, avg 225µs/call
# once (57µs+128µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 208 of Method/Generate/Constructor.pm | ||||
| 148 | my ($class, $target) = @_; | ||||
| 149 | return unless $MAKERS{$target}; | ||||
| 150 | $MAKERS{$target}{constructor} ||= do { | ||||
| 151 | require Method::Generate::Constructor; | ||||
| 152 | require Sub::Defer; | ||||
| 153 | my ($moo_constructor, $con); | ||||
| 154 | |||||
| 155 | 2 | 8µs | my $t_new = $target->can('new'); # spent 8µs making 2 calls to UNIVERSAL::can, avg 4µs/call | ||
| 156 | if ($t_new) { | ||||
| 157 | 3 | 8µs | if ($t_new == Moo::Object->can('new')) { # spent 4µs making 1 call to Sub::Defer::defer_info
# spent 4µs making 2 calls to UNIVERSAL::can, avg 2µs/call | ||
| 158 | $moo_constructor = 1; | ||||
| 159 | } | ||||
| 160 | elsif (my $defer_target = (Sub::Defer::defer_info($t_new)||[])->[0]) { | ||||
| 161 | my ($pkg) = ($defer_target =~ /^(.*)::[^:]+$/); | ||||
| 162 | if ($MAKERS{$pkg}) { | ||||
| 163 | $moo_constructor = 1; | ||||
| 164 | $con = $MAKERS{$pkg}{constructor}; | ||||
| 165 | } | ||||
| 166 | } | ||||
| 167 | } | ||||
| 168 | else { | ||||
| 169 | $moo_constructor = 1; # no other constructor, make a Moo one | ||||
| 170 | } | ||||
| 171 | ($con ? ref($con) : 'Method::Generate::Constructor') | ||||
| 172 | ->new( | ||||
| 173 | package => $target, | ||||
| 174 | accessor_generator => $class->_accessor_maker_for($target), | ||||
| 175 | $moo_constructor ? ( | ||||
| 176 | $con ? (construction_string => $con->construction_string) : () | ||||
| 177 | ) : ( | ||||
| 178 | # spent 16µs (9+7) within Moo::__ANON__[/usr/share/perl5/Moo.pm:183] which was called:
# once (9µs+7µs) by Method::Generate::Constructor::_build_construction_string at line 68 of Method/Generate/Constructor.pm | ||||
| 179 | 1 | 7µs | '$class->next::method(' # spent 7µs making 1 call to UNIVERSAL::can | ||
| 180 | .($target->can('FOREIGNBUILDARGS') ? | ||||
| 181 | '$class->FOREIGNBUILDARGS(@_)' : '@_') | ||||
| 182 | .')' | ||||
| 183 | }, | ||||
| 184 | ), | ||||
| 185 | subconstructor_handler => ( | ||||
| 186 | ' if ($Moo::MAKERS{$class}) {'."\n" | ||||
| 187 | .' if ($Moo::MAKERS{$class}{constructor}) {'."\n" | ||||
| 188 | .' return $class->'.$target.'::SUPER::new(@_);'."\n" | ||||
| 189 | .' }'."\n" | ||||
| 190 | .' '.$class.'->_constructor_maker_for($class);'."\n" | ||||
| 191 | .' return $class->new(@_)'.";\n" | ||||
| 192 | .' } elsif ($INC{"Moose.pm"} and my $meta = Class::MOP::get_metaclass_by_name($class)) {'."\n" | ||||
| 193 | .' return $meta->new_object('."\n" | ||||
| 194 | .' $class->can("BUILDARGS") ? $class->BUILDARGS(@_)'."\n" | ||||
| 195 | .' : $class->Moo::Object::BUILDARGS(@_)'."\n" | ||||
| 196 | .' );'."\n" | ||||
| 197 | .' }'."\n" | ||||
| 198 | ), | ||||
| 199 | ) | ||||
| 200 | ->install_delayed | ||||
| 201 | 8 | 1.56ms | ->register_attribute_specs(%{$con?$con->all_attribute_specs:{}}) # spent 1.36ms making 2 calls to Method::Generate::Constructor::new, avg 682µs/call
# spent 93µs making 2 calls to Moo::_accessor_maker_for, avg 47µs/call
# spent 92µs making 2 calls to Method::Generate::Constructor::install_delayed, avg 46µs/call
# spent 13µs making 2 calls to Method::Generate::Constructor::register_attribute_specs, avg 6µs/call | ||
| 202 | } | ||||
| 203 | } | ||||
| 204 | |||||
| 205 | sub _concrete_methods_of { | ||||
| 206 | my ($me, $role) = @_; | ||||
| 207 | my $makers = $MAKERS{$role}; | ||||
| 208 | # grab role symbol table | ||||
| 209 | my $stash = _getstash($role); | ||||
| 210 | # reverse so our keys become the values (captured coderefs) in case | ||||
| 211 | # they got copied or re-used since | ||||
| 212 | my $not_methods = { reverse %{$makers->{not_methods}||{}} }; | ||||
| 213 | +{ | ||||
| 214 | # grab all code entries that aren't in the not_methods list | ||||
| 215 | map { | ||||
| 216 | my $code = *{$stash->{$_}}{CODE}; | ||||
| 217 | ( ! $code or exists $not_methods->{$code} ) ? () : ($_ => $code) | ||||
| 218 | } grep !ref($stash->{$_}), keys %$stash | ||||
| 219 | }; | ||||
| 220 | } | ||||
| 221 | |||||
| 222 | 1; | ||||
| 223 | __END__ |