| Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Method/Generate/Constructor.pm |
| Statements | Executed 2498 statements in 6.65ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 3 | 1 | 1 | 1.09ms | 1.37ms | Method::Generate::Constructor::buildall_generator |
| 62 | 4 | 2 | 945µs | 2.02ms | Method::Generate::Constructor::register_attribute_specs |
| 8 | 1 | 1 | 756µs | 21.8ms | Method::Generate::Constructor::_assign_new |
| 8 | 1 | 1 | 517µs | 38.6ms | Method::Generate::Constructor::generate_method |
| 74 | 3 | 2 | 433µs | 1.03ms | Method::Generate::Constructor::assert_constructor |
| 74 | 1 | 1 | 347µs | 594µs | Method::Generate::Constructor::current_constructor |
| 1 | 1 | 1 | 270µs | 282µs | Method::Generate::Constructor::BEGIN@10 |
| 10 | 1 | 1 | 242µs | 2.58ms | Method::Generate::Constructor::install_delayed |
| 8 | 1 | 1 | 237µs | 313µs | Method::Generate::Constructor::_check_required |
| 8 | 1 | 1 | 195µs | 38.8ms | Method::Generate::Constructor::__ANON__[:101] |
| 55 | 1 | 1 | 170µs | 170µs | Method::Generate::Constructor::_cap_call |
| 8 | 1 | 1 | 96µs | 230µs | Method::Generate::Constructor::_handle_subconstructor |
| 76 | 3 | 1 | 76µs | 76µs | Method::Generate::Constructor::accessor_generator |
| 63 | 1 | 1 | 56µs | 56µs | Method::Generate::Constructor::CORE:subst (opcode) |
| 7 | 1 | 1 | 55µs | 78µs | Method::Generate::Constructor::_build_construction_string |
| 9 | 2 | 2 | 42µs | 120µs | Method::Generate::Constructor::construction_string |
| 24 | 3 | 1 | 32µs | 32µs | Method::Generate::Constructor::CORE:sort (opcode) |
| 1 | 1 | 1 | 26µs | 29µs | Method::Generate::Constructor::BEGIN@2 |
| 6 | 1 | 1 | 17µs | 17µs | Method::Generate::Constructor::_generate_args |
| 1 | 1 | 1 | 6µs | 265µs | Method::Generate::Constructor::BEGIN@12 |
| 1 | 1 | 1 | 6µs | 32µs | Method::Generate::Constructor::BEGIN@3 |
| 1 | 1 | 1 | 6µs | 21µs | Method::Generate::Constructor::BEGIN@8 |
| 1 | 1 | 1 | 4µs | 4µs | Method::Generate::Constructor::BEGIN@11 |
| 1 | 1 | 1 | 4µs | 19µs | Method::Generate::Constructor::BEGIN@6 |
| 1 | 1 | 1 | 4µs | 21µs | Method::Generate::Constructor::BEGIN@7 |
| 1 | 1 | 1 | 3µs | 25µs | Method::Generate::Constructor::BEGIN@5 |
| 1 | 1 | 1 | 3µs | 21µs | Method::Generate::Constructor::BEGIN@9 |
| 3 | 2 | 1 | 3µs | 3µs | Method::Generate::Constructor::all_attribute_specs |
| 2 | 1 | 1 | 2µs | 2µs | Method::Generate::Constructor::_generate_args_via_buildargs |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Method::Generate::Constructor; | ||||
| 2 | 2 | 28µs | 2 | 32µs | # spent 29µs (26+3) within Method::Generate::Constructor::BEGIN@2 which was called:
# once (26µs+3µs) by Moo::_constructor_maker_for at line 2 # spent 29µs making 1 call to Method::Generate::Constructor::BEGIN@2
# spent 3µs making 1 call to strict::import |
| 3 | 2 | 17µs | 2 | 58µs | # spent 32µs (6+26) within Method::Generate::Constructor::BEGIN@3 which was called:
# once (6µs+26µs) by Moo::_constructor_maker_for at line 3 # spent 32µs making 1 call to Method::Generate::Constructor::BEGIN@3
# spent 26µs making 1 call to warnings::import |
| 4 | |||||
| 5 | 2 | 17µs | 2 | 47µs | # spent 25µs (3+22) within Method::Generate::Constructor::BEGIN@5 which was called:
# once (3µs+22µs) by Moo::_constructor_maker_for at line 5 # spent 25µs making 1 call to Method::Generate::Constructor::BEGIN@5
# spent 22µs making 1 call to Exporter::import |
| 6 | 2 | 13µs | 2 | 34µs | # spent 19µs (4+15) within Method::Generate::Constructor::BEGIN@6 which was called:
# once (4µs+15µs) by Moo::_constructor_maker_for at line 6 # spent 19µs making 1 call to Method::Generate::Constructor::BEGIN@6
# spent 15µs making 1 call to Exporter::import |
| 7 | 2 | 15µs | 2 | 38µs | # spent 21µs (4+17) within Method::Generate::Constructor::BEGIN@7 which was called:
# once (4µs+17µs) by Moo::_constructor_maker_for at line 7 # spent 21µs making 1 call to Method::Generate::Constructor::BEGIN@7
# spent 17µs making 1 call to Exporter::import |
| 8 | 2 | 13µs | 2 | 36µs | # spent 21µs (6+15) within Method::Generate::Constructor::BEGIN@8 which was called:
# once (6µs+15µs) by Moo::_constructor_maker_for at line 8 # spent 21µs making 1 call to Method::Generate::Constructor::BEGIN@8
# spent 15µs making 1 call to Exporter::import |
| 9 | 2 | 12µs | 2 | 39µs | # spent 21µs (3+18) within Method::Generate::Constructor::BEGIN@9 which was called:
# once (3µs+18µs) by Moo::_constructor_maker_for at line 9 # spent 21µs making 1 call to Method::Generate::Constructor::BEGIN@9
# spent 18µs making 1 call to Exporter::import |
| 10 | 2 | 188µs | 1 | 282µs | # spent 282µs (270+12) within Method::Generate::Constructor::BEGIN@10 which was called:
# once (270µs+12µs) by Moo::_constructor_maker_for at line 10 # spent 282µs making 1 call to Method::Generate::Constructor::BEGIN@10 |
| 11 | 1 | 29µs | 1 | 4µs | # spent 4µs within Method::Generate::Constructor::BEGIN@11 which was called:
# once (4µs+0s) by Moo::_constructor_maker_for at line 11 # spent 4µs making 1 call to Method::Generate::Constructor::BEGIN@11 |
| 12 | # spent 265µs (6+259) within Method::Generate::Constructor::BEGIN@12 which was called:
# once (6µs+259µs) by Moo::_constructor_maker_for at line 16 | ||||
| 13 | 1 | 0s | local $Moo::sification::disabled = 1; | ||
| 14 | 1 | 1µs | require Moo; | ||
| 15 | 1 | 4µs | 1 | 259µs | Moo->import; # spent 259µs making 1 call to Moo::import |
| 16 | 1 | 1.25ms | 1 | 265µs | } # spent 265µs making 1 call to Method::Generate::Constructor::BEGIN@12 |
| 17 | |||||
| 18 | # spent 2.02ms (945µs+1.08) within Method::Generate::Constructor::register_attribute_specs which was called 62 times, avg 33µs/call:
# 49 times (797µs+942µs) by Moo::has at line 119 of Moo.pm, avg 35µs/call
# 10 times (127µs+121µs) by Moo::_constructor_maker_for at line 262 of Moo.pm, avg 25µs/call
# 2 times (3µs+11µs) by Moo::_set_superclasses at line 158 of Moo.pm, avg 7µs/call
# once (18µs+4µs) by Moo::_constructor_maker_for at line 250 | ||||
| 19 | 62 | 52µs | my ($self, @new_specs) = @_; | ||
| 20 | 62 | 102µs | 62 | 841µs | $self->assert_constructor; # spent 841µs making 62 calls to Method::Generate::Constructor::assert_constructor, avg 14µs/call |
| 21 | 62 | 39µs | my $specs = $self->{attribute_specs}||={}; | ||
| 22 | 62 | 73µs | 62 | 63µs | my $ag = $self->accessor_generator; # spent 63µs making 62 calls to Method::Generate::Constructor::accessor_generator, avg 1µs/call |
| 23 | 62 | 136µs | while (my ($name, $new_spec) = splice @new_specs, 0, 2) { | ||
| 24 | 63 | 147µs | 63 | 56µs | if ($name =~ s/^\+//) { # spent 56µs making 63 calls to Method::Generate::Constructor::CORE:subst, avg 889ns/call |
| 25 | croak "has '+${name}' given but no ${name} attribute already exists" | ||||
| 26 | 2 | 1µs | unless my $old_spec = $specs->{$name}; | ||
| 27 | 2 | 68µs | 2 | 79µs | $ag->merge_specs($new_spec, $old_spec); # spent 79µs making 2 calls to Method::Generate::Accessor::merge_specs, avg 40µs/call |
| 28 | } | ||||
| 29 | 63 | 71µs | 13 | 39µs | if ($new_spec->{required} # spent 39µs making 13 calls to Method::Generate::Accessor::has_default, avg 3µs/call |
| 30 | && !( | ||||
| 31 | $ag->has_default($name, $new_spec) | ||||
| 32 | || !exists $new_spec->{init_arg} | ||||
| 33 | || defined $new_spec->{init_arg} | ||||
| 34 | ) | ||||
| 35 | ) { | ||||
| 36 | croak "You cannot have a required attribute (${name})" | ||||
| 37 | . " without a default, builder, or an init_arg"; | ||||
| 38 | } | ||||
| 39 | $new_spec->{index} = scalar keys %$specs | ||||
| 40 | 63 | 75µs | unless defined $new_spec->{index}; | ||
| 41 | 63 | 64µs | $specs->{$name} = $new_spec; | ||
| 42 | } | ||||
| 43 | 62 | 147µs | $self; | ||
| 44 | } | ||||
| 45 | |||||
| 46 | # spent 3µs within Method::Generate::Constructor::all_attribute_specs which was called 3 times, avg 1µs/call:
# 2 times (2µs+0s) by Moo::_set_superclasses at line 158 of Moo.pm, avg 1µs/call
# once (1µs+0s) by Moo::_constructor_maker_for at line 262 of Moo.pm | ||||
| 47 | $_[0]->{attribute_specs} | ||||
| 48 | 3 | 45µs | } | ||
| 49 | |||||
| 50 | # spent 76µs within Method::Generate::Constructor::accessor_generator which was called 76 times, avg 1µs/call:
# 62 times (63µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 22, avg 1µs/call
# 8 times (4µs+0s) by Method::Generate::Constructor::_assign_new at line 209, avg 500ns/call
# 6 times (9µs+0s) by Method::Generate::Constructor::_build_construction_string at line 68, avg 2µs/call | ||||
| 51 | $_[0]->{accessor_generator} | ||||
| 52 | 76 | 141µs | } | ||
| 53 | |||||
| 54 | # spent 120µs (42+78) within Method::Generate::Constructor::construction_string which was called 9 times, avg 13µs/call:
# 8 times (37µs+65µs) by Method::Generate::Constructor::generate_method at line 138, avg 13µs/call
# once (5µs+13µs) by Moo::_constructor_maker_for at line 237 of Moo.pm | ||||
| 55 | 9 | 4µs | my ($self) = @_; | ||
| 56 | $self->{construction_string} | ||||
| 57 | 9 | 31µs | 7 | 78µs | ||= $self->_build_construction_string; # spent 78µs making 7 calls to Method::Generate::Constructor::_build_construction_string, avg 11µs/call |
| 58 | } | ||||
| 59 | |||||
| 60 | # spent 1.37ms (1.09+274µs) within Method::Generate::Constructor::buildall_generator which was called 3 times, avg 456µs/call:
# 3 times (1.09ms+274µs) by Method::Generate::Constructor::generate_method at line 138, avg 456µs/call | ||||
| 61 | 3 | 638µs | require Method::Generate::BuildAll; | ||
| 62 | 3 | 33µs | 3 | 68µs | Method::Generate::BuildAll->new; # spent 68µs making 3 calls to Moo::Object::new, avg 23µs/call |
| 63 | } | ||||
| 64 | |||||
| 65 | # spent 78µs (55+23) within Method::Generate::Constructor::_build_construction_string which was called 7 times, avg 11µs/call:
# 7 times (55µs+23µs) by Method::Generate::Constructor::construction_string at line 57, avg 11µs/call | ||||
| 66 | 7 | 1µs | my ($self) = @_; | ||
| 67 | 7 | 3µs | my $builder = $self->{construction_builder}; | ||
| 68 | 7 | 45µs | 13 | 23µs | $builder ? $self->$builder # spent 9µs making 6 calls to Method::Generate::Constructor::accessor_generator, avg 2µs/call
# spent 8µs making 1 call to Moo::__ANON__[Moo.pm:256]
# spent 6µs making 6 calls to Method::Generate::Accessor::default_construction_string, avg 1µs/call |
| 69 | : 'bless(' | ||||
| 70 | .$self->accessor_generator->default_construction_string | ||||
| 71 | .', $class);' | ||||
| 72 | } | ||||
| 73 | |||||
| 74 | # spent 2.58ms (242µs+2.34) within Method::Generate::Constructor::install_delayed which was called 10 times, avg 258µs/call:
# 10 times (242µs+2.34ms) by Moo::_constructor_maker_for at line 262 of Moo.pm, avg 258µs/call | ||||
| 75 | 10 | 6µs | my ($self) = @_; | ||
| 76 | 10 | 34µs | 10 | 172µs | $self->assert_constructor; # spent 172µs making 10 calls to Method::Generate::Constructor::assert_constructor, avg 17µs/call |
| 77 | 10 | 7µs | my $package = $self->{package}; | ||
| 78 | 10 | 42µs | 10 | 9µs | my (undef, @isa) = @{_linear_isa($package)}; # spent 9µs making 10 calls to mro::get_linear_isa, avg 900ns/call |
| 79 | 10 | 12µs | my $isa = join ',', @isa; | ||
| 80 | 10 | 53µs | 10 | 1.65ms | my (undef, $from_file, $from_line) = caller(Carp::short_error_loc()); # spent 1.65ms making 10 calls to Carp::short_error_loc, avg 165µs/call |
| 81 | # spent 38.8ms (195µs+38.6) within Method::Generate::Constructor::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Method/Generate/Constructor.pm:101] which was called 8 times, avg 4.85ms/call:
# 8 times (195µs+38.6ms) by Sub::Defer::undefer_sub at line 85 of Sub/Defer.pm, avg 4.85ms/call | ||||
| 82 | 8 | 65µs | 8 | 25µs | my (undef, @new_isa) = @{_linear_isa($package)}; # spent 25µs making 8 calls to mro::get_linear_isa, avg 3µs/call |
| 83 | 8 | 16µs | if (join(',', @new_isa) ne $isa) { | ||
| 84 | my ($expected_new) = grep { *{_getglob($_.'::new')}{CODE} } @isa; | ||||
| 85 | my ($found_new) = grep { *{_getglob($_.'::new')}{CODE} } @new_isa; | ||||
| 86 | if (($found_new||'') ne ($expected_new||'')) { | ||||
| 87 | $found_new ||= 'none'; | ||||
| 88 | $expected_new ||= 'none'; | ||||
| 89 | croak "Expected parent constructor of $package to be" | ||||
| 90 | . " $expected_new, but found $found_new: changing the inheritance" | ||||
| 91 | . " chain (\@ISA) at runtime (after $from_file line $from_line) is unsupported"; | ||||
| 92 | } | ||||
| 93 | } | ||||
| 94 | |||||
| 95 | my $constructor = $self->generate_method( | ||||
| 96 | 8 | 52µs | 8 | 38.6ms | $package, 'new', $self->{attribute_specs}, { no_install => 1, no_defer => 1 } # spent 38.6ms making 8 calls to Method::Generate::Constructor::generate_method, avg 4.82ms/call |
| 97 | ); | ||||
| 98 | 8 | 11µs | $self->{inlined} = 1; | ||
| 99 | 8 | 34µs | 8 | 10µs | weaken($self->{constructor} = $constructor); # spent 10µs making 8 calls to Scalar::Util::weaken, avg 1µs/call |
| 100 | 8 | 29µs | $constructor; | ||
| 101 | 10 | 58µs | 10 | 494µs | }; # spent 494µs making 10 calls to Sub::Defer::defer_sub, avg 49µs/call |
| 102 | 10 | 9µs | $self->{inlined} = 0; | ||
| 103 | 10 | 24µs | 10 | 7µs | weaken($self->{constructor} = $constructor); # spent 7µs making 10 calls to Scalar::Util::weaken, avg 700ns/call |
| 104 | 10 | 18µs | $self; | ||
| 105 | } | ||||
| 106 | |||||
| 107 | # spent 594µs (347+247) within Method::Generate::Constructor::current_constructor which was called 74 times, avg 8µs/call:
# 74 times (347µs+247µs) by Method::Generate::Constructor::assert_constructor at line 115, avg 8µs/call | ||||
| 108 | 74 | 38µs | my ($self, $package) = @_; | ||
| 109 | 74 | 284µs | 74 | 247µs | return *{_getglob("${package}::new")}{CODE}; # spent 247µs making 74 calls to Moo::_Utils::_getglob, avg 3µs/call |
| 110 | } | ||||
| 111 | |||||
| 112 | # spent 1.03ms (433µs+594µs) within Method::Generate::Constructor::assert_constructor which was called 74 times, avg 14µs/call:
# 62 times (363µs+478µs) by Method::Generate::Constructor::register_attribute_specs at line 20, avg 14µs/call
# 10 times (61µs+111µs) by Method::Generate::Constructor::install_delayed at line 76, avg 17µs/call
# 2 times (9µs+5µs) by Moo::_set_superclasses at line 155 of Moo.pm, avg 7µs/call | ||||
| 113 | 74 | 27µs | my ($self) = @_; | ||
| 114 | 74 | 52µs | my $package = $self->{package} or return 1; | ||
| 115 | 74 | 153µs | 74 | 594µs | my $current = $self->current_constructor($package) # spent 594µs making 74 calls to Method::Generate::Constructor::current_constructor, avg 8µs/call |
| 116 | or return 1; | ||||
| 117 | my $constructor = $self->{constructor} | ||||
| 118 | 64 | 26µs | or croak "Unknown constructor for $package already exists"; | ||
| 119 | 64 | 44µs | croak "Constructor for $package has been replaced with an unknown sub" | ||
| 120 | if $constructor != $current; | ||||
| 121 | croak "Constructor for $package has been inlined and cannot be updated" | ||||
| 122 | 64 | 117µs | if $self->{inlined}; | ||
| 123 | } | ||||
| 124 | |||||
| 125 | # spent 38.6ms (517µs+38.1) within Method::Generate::Constructor::generate_method which was called 8 times, avg 4.82ms/call:
# 8 times (517µs+38.1ms) by Method::Generate::Constructor::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Method/Generate/Constructor.pm:101] at line 96, avg 4.82ms/call | ||||
| 126 | 8 | 4µs | my ($self, $into, $name, $spec, $quote_opts) = @_; | ||
| 127 | $quote_opts = { | ||||
| 128 | 8 | 19µs | %{$quote_opts||{}}, | ||
| 129 | package => $into, | ||||
| 130 | }; | ||||
| 131 | 8 | 70µs | foreach my $no_init (grep !exists($spec->{$_}{init_arg}), keys %$spec) { | ||
| 132 | 51 | 51µs | $spec->{$no_init}{init_arg} = $no_init; | ||
| 133 | } | ||||
| 134 | 8 | 16µs | local $self->{captures} = {}; | ||
| 135 | |||||
| 136 | 8 | 75µs | 8 | 35µs | my $into_buildargs = $into->can('BUILDARGS'); # spent 35µs making 8 calls to UNIVERSAL::can, avg 4µs/call |
| 137 | |||||
| 138 | 8 | 339µs | 54 | 24.1ms | my $body # spent 21.8ms making 8 calls to Method::Generate::Constructor::_assign_new, avg 2.73ms/call
# spent 1.37ms making 3 calls to Method::Generate::Constructor::buildall_generator, avg 456µs/call
# spent 313µs making 8 calls to Method::Generate::Constructor::_check_required, avg 39µs/call
# spent 230µs making 8 calls to Method::Generate::Constructor::_handle_subconstructor, avg 29µs/call
# spent 141µs making 3 calls to Method::Generate::BuildAll::buildall_body_for, avg 47µs/call
# spent 102µs making 8 calls to Method::Generate::Constructor::construction_string, avg 13µs/call
# spent 98µs making 8 calls to UNIVERSAL::can, avg 12µs/call
# spent 17µs making 6 calls to Method::Generate::Constructor::_generate_args, avg 3µs/call
# spent 2µs making 2 calls to Method::Generate::Constructor::_generate_args_via_buildargs, avg 1µs/call |
| 139 | = ' my $invoker = CORE::shift();'."\n" | ||||
| 140 | . ' my $class = CORE::ref($invoker) ? CORE::ref($invoker) : $invoker;'."\n" | ||||
| 141 | . $self->_handle_subconstructor($into, $name) | ||||
| 142 | . ( $into_buildargs && $into_buildargs != \&Moo::Object::BUILDARGS | ||||
| 143 | ? $self->_generate_args_via_buildargs | ||||
| 144 | : $self->_generate_args | ||||
| 145 | ) | ||||
| 146 | . $self->_check_required($spec) | ||||
| 147 | . ' my $new = '.$self->construction_string.";\n" | ||||
| 148 | . $self->_assign_new($spec) | ||||
| 149 | . ( $into->can('BUILD') | ||||
| 150 | ? $self->buildall_generator->buildall_body_for( $into, '$new', '$args' ) | ||||
| 151 | : '' | ||||
| 152 | ) | ||||
| 153 | . ' return $new;'."\n"; | ||||
| 154 | |||||
| 155 | 8 | 47µs | 8 | 29µs | if ($into->can('DEMOLISH')) { # spent 29µs making 8 calls to UNIVERSAL::can, avg 4µs/call |
| 156 | require Method::Generate::DemolishAll; | ||||
| 157 | Method::Generate::DemolishAll->new->generate_method($into); | ||||
| 158 | } | ||||
| 159 | quote_sub | ||||
| 160 | "${into}::${name}" => $body, | ||||
| 161 | 8 | 91µs | 8 | 13.9ms | $self->{captures}, $quote_opts||{} # spent 13.9ms making 8 calls to Sub::Quote::quote_sub, avg 1.74ms/call |
| 162 | ; | ||||
| 163 | } | ||||
| 164 | |||||
| 165 | # spent 230µs (96+134) within Method::Generate::Constructor::_handle_subconstructor which was called 8 times, avg 29µs/call:
# 8 times (96µs+134µs) by Method::Generate::Constructor::generate_method at line 138, avg 29µs/call | ||||
| 166 | 8 | 3µs | my ($self, $into, $name) = @_; | ||
| 167 | 8 | 65µs | 8 | 134µs | if (my $gen = $self->{subconstructor_handler}) { # spent 134µs making 8 calls to Sub::Quote::quotify, avg 17µs/call |
| 168 | ' if ($class ne '.quotify($into).') {'."\n". | ||||
| 169 | $gen. | ||||
| 170 | ' }'."\n"; | ||||
| 171 | } else { | ||||
| 172 | '' | ||||
| 173 | } | ||||
| 174 | } | ||||
| 175 | |||||
| 176 | # spent 170µs within Method::Generate::Constructor::_cap_call which was called 55 times, avg 3µs/call:
# 55 times (170µs+0s) by Method::Generate::Constructor::_assign_new at line 223, avg 3µs/call | ||||
| 177 | 55 | 13µs | my ($self, $code, $captures) = @_; | ||
| 178 | 55 | 109µs | @{$self->{captures}}{keys %$captures} = values %$captures if $captures; | ||
| 179 | 55 | 83µs | $code; | ||
| 180 | } | ||||
| 181 | |||||
| 182 | # spent 2µs within Method::Generate::Constructor::_generate_args_via_buildargs which was called 2 times, avg 1µs/call:
# 2 times (2µs+0s) by Method::Generate::Constructor::generate_method at line 138, avg 1µs/call | ||||
| 183 | 2 | 0s | my ($self) = @_; | ||
| 184 | 2 | 4µs | q{ my $args = $class->BUILDARGS(@_);}."\n" | ||
| 185 | .q{ Carp::croak("BUILDARGS did not return a hashref") unless CORE::ref($args) eq 'HASH';} | ||||
| 186 | ."\n"; | ||||
| 187 | } | ||||
| 188 | |||||
| 189 | # inlined from Moo::Object - update that first. | ||||
| 190 | # spent 17µs within Method::Generate::Constructor::_generate_args which was called 6 times, avg 3µs/call:
# 6 times (17µs+0s) by Method::Generate::Constructor::generate_method at line 138, avg 3µs/call | ||||
| 191 | 6 | 4µs | my ($self) = @_; | ||
| 192 | 6 | 11µs | return <<'_EOA'; | ||
| 193 | my $args = scalar @_ == 1 | ||||
| 194 | ? CORE::ref $_[0] eq 'HASH' | ||||
| 195 | ? { %{ $_[0] } } | ||||
| 196 | : Carp::croak("Single parameters to new() must be a HASH ref" | ||||
| 197 | . " data => ". $_[0]) | ||||
| 198 | : @_ % 2 | ||||
| 199 | ? Carp::croak("The new() method for $class expects a hash reference or a" | ||||
| 200 | . " key/value list. You passed an odd number of arguments") | ||||
| 201 | : {@_} | ||||
| 202 | ; | ||||
| 203 | _EOA | ||||
| 204 | |||||
| 205 | } | ||||
| 206 | |||||
| 207 | # spent 21.8ms (756µs+21.1) within Method::Generate::Constructor::_assign_new which was called 8 times, avg 2.73ms/call:
# 8 times (756µs+21.1ms) by Method::Generate::Constructor::generate_method at line 138, avg 2.73ms/call | ||||
| 208 | 8 | 3µs | my ($self, $spec) = @_; | ||
| 209 | 8 | 9µs | 8 | 4µs | my $ag = $self->accessor_generator; # spent 4µs making 8 calls to Method::Generate::Constructor::accessor_generator, avg 500ns/call |
| 210 | 8 | 2µs | my %test; | ||
| 211 | 8 | 27µs | 8 | 6µs | NAME: foreach my $name (sort keys %$spec) { # spent 6µs making 8 calls to Method::Generate::Constructor::CORE:sort, avg 750ns/call |
| 212 | 61 | 22µs | my $attr_spec = $spec->{$name}; | ||
| 213 | next NAME unless defined($attr_spec->{init_arg}) | ||||
| 214 | 61 | 29µs | 6 | 8µs | or $ag->has_eager_default($name, $attr_spec); # spent 8µs making 6 calls to Method::Generate::Accessor::has_eager_default, avg 1µs/call |
| 215 | 55 | 47µs | $test{$name} = $attr_spec->{init_arg}; | ||
| 216 | } | ||||
| 217 | join '', map { | ||||
| 218 | 63 | 230µs | 8 | 6µs | my $arg = $test{$_}; # spent 6µs making 8 calls to Method::Generate::Constructor::CORE:sort, avg 750ns/call |
| 219 | 55 | 70µs | 55 | 257µs | my $arg_key = quotify($arg); # spent 257µs making 55 calls to Sub::Quote::quotify, avg 5µs/call |
| 220 | 55 | 24µs | my $test = defined $arg ? "exists \$args->{$arg_key}" : undef; | ||
| 221 | 55 | 10µs | my $source = defined $arg ? "\$args->{$arg_key}" : undef; | ||
| 222 | 55 | 28µs | my $attr_spec = $spec->{$_}; | ||
| 223 | 55 | 156µs | 110 | 20.8ms | $self->_cap_call($ag->generate_populate_set( # spent 20.6ms making 55 calls to Method::Generate::Accessor::generate_populate_set, avg 375µs/call
# spent 170µs making 55 calls to Method::Generate::Constructor::_cap_call, avg 3µs/call |
| 224 | '$new', $_, $attr_spec, $source, $test, $arg, | ||||
| 225 | )); | ||||
| 226 | } sort keys %test; | ||||
| 227 | } | ||||
| 228 | |||||
| 229 | # spent 313µs (237+76) within Method::Generate::Constructor::_check_required which was called 8 times, avg 39µs/call:
# 8 times (237µs+76µs) by Method::Generate::Constructor::generate_method at line 138, avg 39µs/call | ||||
| 230 | 8 | 4µs | my ($self, $spec) = @_; | ||
| 231 | my @required_init = | ||||
| 232 | map $spec->{$_}{init_arg}, | ||||
| 233 | grep { | ||||
| 234 | 69 | 132µs | 8 | 20µs | my $s = $spec->{$_}; # ignore required if default or builder set # spent 20µs making 8 calls to Method::Generate::Constructor::CORE:sort, avg 2µs/call |
| 235 | $s->{required} and not($s->{builder} or exists $s->{default}) | ||||
| 236 | 61 | 44µs | } sort keys %$spec; | ||
| 237 | 8 | 36µs | return '' unless @required_init; | ||
| 238 | 5 | 29µs | 13 | 56µs | ' if (my @missing = grep !exists $args->{$_}, ' # spent 56µs making 13 calls to Sub::Quote::quotify, avg 4µs/call |
| 239 | .join(', ', map quotify($_), @required_init).') {'."\n" | ||||
| 240 | .q{ Carp::croak("Missing required arguments: ".CORE::join(', ', sort @missing));}."\n" | ||||
| 241 | ." }\n"; | ||||
| 242 | } | ||||
| 243 | |||||
| 244 | # bootstrap our own constructor | ||||
| 245 | sub new { | ||||
| 246 | 1 | 0s | my $class = shift; | ||
| 247 | 1 | 4µs | 1 | 3µs | delete _getstash(__PACKAGE__)->{new}; # spent 3µs making 1 call to Moo::_Utils::_getstash |
| 248 | 1 | 10µs | 1 | 1µs | bless $class->BUILDARGS(@_), $class; # spent 1µs making 1 call to Moo::Object::BUILDARGS |
| 249 | } | ||||
| 250 | 1 | 12µs | 2 | 22µs | Moo->_constructor_maker_for(__PACKAGE__) # spent 22µs making 1 call to Method::Generate::Constructor::register_attribute_specs
# spent 338µs making 1 call to Moo::_constructor_maker_for, recursion: max depth 1, sum of overlapping time 338µs |
| 251 | ->register_attribute_specs( | ||||
| 252 | attribute_specs => { | ||||
| 253 | is => 'ro', | ||||
| 254 | reader => 'all_attribute_specs', | ||||
| 255 | }, | ||||
| 256 | accessor_generator => { is => 'ro' }, | ||||
| 257 | construction_string => { is => 'lazy' }, | ||||
| 258 | construction_builder => { is => 'bare' }, | ||||
| 259 | subconstructor_handler => { is => 'ro' }, | ||||
| 260 | package => { is => 'bare' }, | ||||
| 261 | ); | ||||
| 262 | 1 | 0s | if ($INC{'Moo/HandleMoose.pm'} && !$Moo::sification::disabled) { | ||
| 263 | Moo::HandleMoose::inject_fake_metaclass_for(__PACKAGE__); | ||||
| 264 | } | ||||
| 265 | |||||
| 266 | 1 | 7µs | 1; | ||
# spent 32µs within Method::Generate::Constructor::CORE:sort which was called 24 times, avg 1µs/call:
# 8 times (20µs+0s) by Method::Generate::Constructor::_check_required at line 234, avg 2µs/call
# 8 times (6µs+0s) by Method::Generate::Constructor::_assign_new at line 218, avg 750ns/call
# 8 times (6µs+0s) by Method::Generate::Constructor::_assign_new at line 211, avg 750ns/call | |||||
# spent 56µs within Method::Generate::Constructor::CORE:subst which was called 63 times, avg 889ns/call:
# 63 times (56µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 24, avg 889ns/call |