| Filename | /usr/share/perl5/Method/Generate/Constructor.pm |
| Statements | Executed 0 statements in 0s |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 10 | 3 | 2 | 200µs | 209µs | Method::Generate::Constructor::register_attribute_specs |
| 2 | 1 | 1 | 154µs | 662µs | Method::Generate::Constructor::_assign_new |
| 2 | 1 | 1 | 113µs | 1.08ms | Method::Generate::Constructor::generate_method |
| 1 | 1 | 1 | 73µs | 727µs | Method::Generate::Constructor::BEGIN@202 |
| 2 | 1 | 1 | 63µs | 70µs | Method::Generate::Constructor::_check_required |
| 2 | 1 | 1 | 41µs | 109µs | Method::Generate::Constructor::install_delayed |
| 11 | 1 | 1 | 24µs | 24µs | Method::Generate::Constructor::_cap_call |
| 1 | 1 | 1 | 21µs | 73µs | Method::Generate::Constructor::BEGIN@3 |
| 2 | 1 | 1 | 21µs | 2.67ms | Method::Generate::Constructor::__ANON__[:81] |
| 2 | 1 | 1 | 18µs | 31µs | Method::Generate::Constructor::_build_construction_string |
| 2 | 1 | 1 | 16µs | 37µs | Method::Generate::Constructor::_handle_subconstructor |
| 1 | 1 | 1 | 14µs | 43µs | Method::Generate::Constructor::BEGIN@4 |
| 6 | 3 | 1 | 12µs | 12µs | Method::Generate::Constructor::CORE:sort (opcode) |
| 2 | 1 | 1 | 10µs | 41µs | Method::Generate::Constructor::construction_string |
| 1 | 1 | 1 | 10µs | 32µs | Method::Generate::Constructor::BEGIN@5 |
| 1 | 1 | 1 | 10µs | 55µs | Method::Generate::Constructor::__ANON__[:202] |
| 13 | 1 | 1 | 9µs | 9µs | Method::Generate::Constructor::CORE:subst (opcode) |
| 1 | 1 | 1 | 7µs | 36µs | Method::Generate::Constructor::BEGIN@6 |
| 3 | 2 | 1 | 4µs | 4µs | Method::Generate::Constructor::accessor_generator |
| 2 | 1 | 1 | 4µs | 4µs | Method::Generate::Constructor::_generate_args |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Constructor::_generate_args_via_buildargs |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Constructor::all_attribute_specs |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Constructor::buildall_generator |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Method::Generate::Constructor; | ||||
| 2 | |||||
| 3 | 3 | 126µs | # spent 73µs (21+52) within Method::Generate::Constructor::BEGIN@3 which was called:
# once (21µs+52µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 3 # spent 73µs making 1 call to Method::Generate::Constructor::BEGIN@3
# spent 32µs making 1 call to strictures::import
# spent 20µs making 1 call to strictures::VERSION | ||
| 4 | 2 | 72µs | # spent 43µs (14+29) within Method::Generate::Constructor::BEGIN@4 which was called:
# once (14µs+29µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 4 # spent 43µs making 1 call to Method::Generate::Constructor::BEGIN@4
# spent 29µs making 1 call to Exporter::import | ||
| 5 | 2 | 55µs | # spent 32µs (10+22) within Method::Generate::Constructor::BEGIN@5 which was called:
# once (10µs+22µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 5 # spent 32µs making 1 call to Method::Generate::Constructor::BEGIN@5
# spent 22µs making 1 call to Exporter::import | ||
| 6 | 2 | 66µs | # spent 36µs (7+29) within Method::Generate::Constructor::BEGIN@6 which was called:
# once (7µs+29µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 6 # spent 36µs making 1 call to Method::Generate::Constructor::BEGIN@6
# spent 29µs making 1 call to Exporter::import | ||
| 7 | |||||
| 8 | # spent 209µs (200+9) within Method::Generate::Constructor::register_attribute_specs which was called 10 times, avg 21µs/call:
# 7 times (161µs+6µs) by Moo::has at line 52 of Moo.pm, avg 24µs/call
# 2 times (12µs+0s) by Moo::_constructor_maker_for at line 201 of Moo.pm, avg 6µs/call
# once (27µs+3µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 208 | ||||
| 9 | my ($self, @new_specs) = @_; | ||||
| 10 | my $specs = $self->{attribute_specs}||={}; | ||||
| 11 | while (my ($name, $new_spec) = splice @new_specs, 0, 2) { | ||||
| 12 | 13 | 9µs | if ($name =~ s/^\+//) { # spent 9µs making 13 calls to Method::Generate::Constructor::CORE:subst, avg 677ns/call | ||
| 13 | die "has '+${name}' given but no ${name} attribute already exists" | ||||
| 14 | unless my $old_spec = $specs->{$name}; | ||||
| 15 | foreach my $key (keys %$old_spec) { | ||||
| 16 | if (!exists $new_spec->{$key}) { | ||||
| 17 | $new_spec->{$key} = $old_spec->{$key} | ||||
| 18 | unless $key eq 'handles'; | ||||
| 19 | } | ||||
| 20 | elsif ($key eq 'moosify') { | ||||
| 21 | $new_spec->{$key} = [ | ||||
| 22 | map { ref $_ eq 'ARRAY' ? @$_ : $_ } | ||||
| 23 | ($old_spec->{$key}, $new_spec->{$key}) | ||||
| 24 | ]; | ||||
| 25 | } | ||||
| 26 | } | ||||
| 27 | } | ||||
| 28 | if ($new_spec->{required} | ||||
| 29 | && !( | ||||
| 30 | exists $new_spec->{default} | ||||
| 31 | || $new_spec->{builder} | ||||
| 32 | || !exists $new_spec->{init_arg} | ||||
| 33 | || defined $new_spec->{init_arg} | ||||
| 34 | ) | ||||
| 35 | ) { | ||||
| 36 | die "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 | unless defined $new_spec->{index}; | ||||
| 41 | $specs->{$name} = $new_spec; | ||||
| 42 | } | ||||
| 43 | $self; | ||||
| 44 | } | ||||
| 45 | |||||
| 46 | sub all_attribute_specs { | ||||
| 47 | $_[0]->{attribute_specs} | ||||
| 48 | } | ||||
| 49 | |||||
| 50 | sub accessor_generator { | ||||
| 51 | $_[0]->{accessor_generator} | ||||
| 52 | } | ||||
| 53 | |||||
| 54 | # spent 41µs (10+31) within Method::Generate::Constructor::construction_string which was called 2 times, avg 20µs/call:
# 2 times (10µs+31µs) by Method::Generate::Constructor::generate_method at line 101, avg 20µs/call | ||||
| 55 | my ($self) = @_; | ||||
| 56 | 2 | 31µs | $self->{construction_string} # spent 31µs making 2 calls to Method::Generate::Constructor::_build_construction_string, avg 15µs/call | ||
| 57 | ||= $self->_build_construction_string; | ||||
| 58 | } | ||||
| 59 | |||||
| 60 | sub buildall_generator { | ||||
| 61 | require Method::Generate::BuildAll; | ||||
| 62 | Method::Generate::BuildAll->new; | ||||
| 63 | } | ||||
| 64 | |||||
| 65 | # spent 31µs (18+13) within Method::Generate::Constructor::_build_construction_string which was called 2 times, avg 15µs/call:
# 2 times (18µs+13µs) by Method::Generate::Constructor::construction_string at line 56, avg 15µs/call | ||||
| 66 | my ($self) = @_; | ||||
| 67 | my $builder = $self->{construction_builder}; | ||||
| 68 | 3 | 13µs | $builder ? $self->$builder # spent 10µs making 1 call to Moo::__ANON__[Moo.pm:183]
# spent 2µs making 1 call to Method::Generate::Accessor::default_construction_string
# spent 2µs making 1 call to Method::Generate::Constructor::accessor_generator | ||
| 69 | : 'bless(' | ||||
| 70 | .$self->accessor_generator->default_construction_string | ||||
| 71 | .', $class);' | ||||
| 72 | } | ||||
| 73 | |||||
| 74 | # spent 109µs (41+68) within Method::Generate::Constructor::install_delayed which was called 2 times, avg 54µs/call:
# 2 times (41µs+68µs) by Moo::_constructor_maker_for at line 201 of Moo.pm, avg 54µs/call | ||||
| 75 | my ($self) = @_; | ||||
| 76 | my $package = $self->{package}; | ||||
| 77 | # spent 2.67ms (21µs+2.65) within Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:81] which was called 2 times, avg 1.34ms/call:
# 2 times (21µs+2.65ms) by Sub::Defer::undefer_sub at line 22 of Sub/Defer.pm, avg 1.34ms/call | ||||
| 78 | 4 | 2.65ms | unquote_sub $self->generate_method( # spent 1.57ms making 2 calls to Sub::Quote::unquote_sub, avg 786µs/call
# spent 1.08ms making 2 calls to Method::Generate::Constructor::generate_method, avg 541µs/call | ||
| 79 | $package, 'new', $self->{attribute_specs}, { no_install => 1 } | ||||
| 80 | ) | ||||
| 81 | 2 | 68µs | }; # spent 68µs making 2 calls to Sub::Defer::defer_sub, avg 34µs/call | ||
| 82 | $self; | ||||
| 83 | } | ||||
| 84 | |||||
| 85 | # spent 1.08ms (113µs+968µs) within Method::Generate::Constructor::generate_method which was called 2 times, avg 541µs/call:
# 2 times (113µs+968µs) by Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:81] at line 78, avg 541µs/call | ||||
| 86 | my ($self, $into, $name, $spec, $quote_opts) = @_; | ||||
| 87 | foreach my $no_init (grep !exists($spec->{$_}{init_arg}), keys %$spec) { | ||||
| 88 | $spec->{$no_init}{init_arg} = $no_init; | ||||
| 89 | } | ||||
| 90 | local $self->{captures} = {}; | ||||
| 91 | my $body = ' my $class = shift;'."\n" | ||||
| 92 | .' $class = ref($class) if ref($class);'."\n"; | ||||
| 93 | 2 | 37µs | $body .= $self->_handle_subconstructor($into, $name); # spent 37µs making 2 calls to Method::Generate::Constructor::_handle_subconstructor, avg 18µs/call | ||
| 94 | 2 | 9µs | my $into_buildargs = $into->can('BUILDARGS'); # spent 9µs making 2 calls to UNIVERSAL::can, avg 4µs/call | ||
| 95 | if ( $into_buildargs && $into_buildargs != \&Moo::Object::BUILDARGS ) { | ||||
| 96 | $body .= $self->_generate_args_via_buildargs; | ||||
| 97 | } else { | ||||
| 98 | 2 | 4µs | $body .= $self->_generate_args; # spent 4µs making 2 calls to Method::Generate::Constructor::_generate_args, avg 2µs/call | ||
| 99 | } | ||||
| 100 | 2 | 70µs | $body .= $self->_check_required($spec); # spent 70µs making 2 calls to Method::Generate::Constructor::_check_required, avg 35µs/call | ||
| 101 | 2 | 41µs | $body .= ' my $new = '.$self->construction_string.";\n"; # spent 41µs making 2 calls to Method::Generate::Constructor::construction_string, avg 20µs/call | ||
| 102 | 2 | 662µs | $body .= $self->_assign_new($spec); # spent 662µs making 2 calls to Method::Generate::Constructor::_assign_new, avg 331µs/call | ||
| 103 | 2 | 10µs | if ($into->can('BUILD')) { # spent 10µs making 2 calls to UNIVERSAL::can, avg 5µs/call | ||
| 104 | $body .= $self->buildall_generator->buildall_body_for( | ||||
| 105 | $into, '$new', '$args' | ||||
| 106 | ); | ||||
| 107 | } | ||||
| 108 | $body .= ' return $new;'."\n"; | ||||
| 109 | 2 | 6µs | if ($into->can('DEMOLISH')) { # spent 6µs making 2 calls to UNIVERSAL::can, avg 3µs/call | ||
| 110 | require Method::Generate::DemolishAll; | ||||
| 111 | Method::Generate::DemolishAll->new->generate_method($into); | ||||
| 112 | } | ||||
| 113 | quote_sub | ||||
| 114 | 2 | 130µs | "${into}::${name}" => $body, # spent 130µs making 2 calls to Sub::Quote::quote_sub, avg 65µs/call | ||
| 115 | $self->{captures}, $quote_opts||{} | ||||
| 116 | ; | ||||
| 117 | } | ||||
| 118 | |||||
| 119 | # spent 37µs (16+20) within Method::Generate::Constructor::_handle_subconstructor which was called 2 times, avg 18µs/call:
# 2 times (16µs+20µs) by Method::Generate::Constructor::generate_method at line 93, avg 18µs/call | ||||
| 120 | my ($self, $into, $name) = @_; | ||||
| 121 | 2 | 20µs | if (my $gen = $self->{subconstructor_handler}) { # spent 20µs making 2 calls to Sub::Quote::quotify, avg 10µs/call | ||
| 122 | ' if ($class ne '.quotify($into).') {'."\n". | ||||
| 123 | $gen. | ||||
| 124 | ' }'."\n"; | ||||
| 125 | } else { | ||||
| 126 | '' | ||||
| 127 | } | ||||
| 128 | } | ||||
| 129 | |||||
| 130 | # spent 24µs within Method::Generate::Constructor::_cap_call which was called 11 times, avg 2µs/call:
# 11 times (24µs+0s) by Method::Generate::Constructor::_assign_new at line 181, avg 2µs/call | ||||
| 131 | my ($self, $code, $captures) = @_; | ||||
| 132 | @{$self->{captures}}{keys %$captures} = values %$captures if $captures; | ||||
| 133 | $code; | ||||
| 134 | } | ||||
| 135 | |||||
| 136 | sub _generate_args_via_buildargs { | ||||
| 137 | my ($self) = @_; | ||||
| 138 | q{ my $args = $class->BUILDARGS(@_);}."\n" | ||||
| 139 | .q{ die "BUILDARGS did not return a hashref" unless ref($args) eq 'HASH';} | ||||
| 140 | ."\n"; | ||||
| 141 | } | ||||
| 142 | |||||
| 143 | # inlined from Moo::Object - update that first. | ||||
| 144 | # spent 4µs within Method::Generate::Constructor::_generate_args which was called 2 times, avg 2µs/call:
# 2 times (4µs+0s) by Method::Generate::Constructor::generate_method at line 98, avg 2µs/call | ||||
| 145 | my ($self) = @_; | ||||
| 146 | return <<'_EOA'; | ||||
| 147 | my $args; | ||||
| 148 | if ( scalar @_ == 1 ) { | ||||
| 149 | unless ( defined $_[0] && ref $_[0] eq 'HASH' ) { | ||||
| 150 | die "Single parameters to new() must be a HASH ref" | ||||
| 151 | ." data => ". $_[0] ."\n"; | ||||
| 152 | } | ||||
| 153 | $args = { %{ $_[0] } }; | ||||
| 154 | } | ||||
| 155 | elsif ( @_ % 2 ) { | ||||
| 156 | die "The new() method for $class expects a hash reference or a" | ||||
| 157 | . " key/value list. You passed an odd number of arguments\n"; | ||||
| 158 | } | ||||
| 159 | else { | ||||
| 160 | $args = {@_}; | ||||
| 161 | } | ||||
| 162 | _EOA | ||||
| 163 | |||||
| 164 | } | ||||
| 165 | |||||
| 166 | # spent 662µs (154+507) within Method::Generate::Constructor::_assign_new which was called 2 times, avg 331µs/call:
# 2 times (154µs+507µs) by Method::Generate::Constructor::generate_method at line 102, avg 331µs/call | ||||
| 167 | my ($self, $spec) = @_; | ||||
| 168 | 2 | 2µs | my $ag = $self->accessor_generator; # spent 2µs making 2 calls to Method::Generate::Constructor::accessor_generator, avg 1µs/call | ||
| 169 | my %test; | ||||
| 170 | 2 | 2µs | NAME: foreach my $name (sort keys %$spec) { # spent 2µs making 2 calls to Method::Generate::Constructor::CORE:sort, avg 1µs/call | ||
| 171 | my $attr_spec = $spec->{$name}; | ||||
| 172 | 2 | 6µs | next NAME unless defined($attr_spec->{init_arg}) # spent 6µs making 2 calls to Method::Generate::Accessor::has_eager_default, avg 3µs/call | ||
| 173 | or $ag->has_eager_default($name, $attr_spec); | ||||
| 174 | $test{$name} = $attr_spec->{init_arg}; | ||||
| 175 | } | ||||
| 176 | 11 | 35µs | join '', map { # spent 35µs making 11 calls to Sub::Quote::quotify, avg 3µs/call | ||
| 177 | 2 | 2µs | my $arg_key = quotify($test{$_}); # spent 2µs making 2 calls to Method::Generate::Constructor::CORE:sort, avg 1µs/call | ||
| 178 | my $test = "exists \$args->{$arg_key}"; | ||||
| 179 | my $source = "\$args->{$arg_key}"; | ||||
| 180 | my $attr_spec = $spec->{$_}; | ||||
| 181 | 22 | 460µs | $self->_cap_call($ag->generate_populate_set( # spent 436µs making 11 calls to Method::Generate::Accessor::generate_populate_set, avg 40µs/call
# spent 24µs making 11 calls to Method::Generate::Constructor::_cap_call, avg 2µs/call | ||
| 182 | '$new', $_, $attr_spec, $source, $test, $test{$_}, | ||||
| 183 | )); | ||||
| 184 | } sort keys %test; | ||||
| 185 | } | ||||
| 186 | |||||
| 187 | # spent 70µs (63+7) within Method::Generate::Constructor::_check_required which was called 2 times, avg 35µs/call:
# 2 times (63µs+7µs) by Method::Generate::Constructor::generate_method at line 100, avg 35µs/call | ||||
| 188 | my ($self, $spec) = @_; | ||||
| 189 | my @required_init = | ||||
| 190 | map $spec->{$_}{init_arg}, | ||||
| 191 | grep { | ||||
| 192 | 2 | 7µs | my %s = %{$spec->{$_}}; # ignore required if default or builder set # spent 7µs making 2 calls to Method::Generate::Constructor::CORE:sort, avg 4µs/call | ||
| 193 | $s{required} and not($s{builder} or $s{default}) | ||||
| 194 | } sort keys %$spec; | ||||
| 195 | return '' unless @required_init; | ||||
| 196 | ' if (my @missing = grep !exists $args->{$_}, qw(' | ||||
| 197 | .join(' ',@required_init).')) {'."\n" | ||||
| 198 | .q{ die "Missing required arguments: ".join(', ', sort @missing);}."\n" | ||||
| 199 | ." }\n"; | ||||
| 200 | } | ||||
| 201 | |||||
| 202 | 4 | 1.43ms | # spent 55µs (10+45) within Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:202] which was called:
# once (10µs+45µs) by import::into at line 36 of Import/Into.pm
# spent 727µs (73+653) within Method::Generate::Constructor::BEGIN@202 which was called:
# once (73µs+653µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 202 # spent 727µs making 1 call to Method::Generate::Constructor::BEGIN@202
# spent 653µs making 1 call to Moo::import
# spent 33µs making 1 call to strictures::import
# spent 12µs making 1 call to Module::Runtime::use_module | ||
| 203 | # bootstrap our own constructor | ||||
| 204 | sub new { | ||||
| 205 | my $class = shift; | ||||
| 206 | 1 | 6µs | bless $class->BUILDARGS(@_), $class; # spent 6µs making 1 call to Moo::Object::BUILDARGS | ||
| 207 | } | ||||
| 208 | 2 | 235µs | Moo->_constructor_maker_for(__PACKAGE__) # spent 205µs making 1 call to Moo::_constructor_maker_for
# spent 30µs making 1 call to Method::Generate::Constructor::register_attribute_specs | ||
| 209 | ->register_attribute_specs( | ||||
| 210 | attribute_specs => { | ||||
| 211 | is => 'ro', | ||||
| 212 | reader => 'all_attribute_specs', | ||||
| 213 | }, | ||||
| 214 | accessor_generator => { is => 'ro' }, | ||||
| 215 | construction_string => { is => 'lazy' }, | ||||
| 216 | construction_builder => { is => 'bare' }, | ||||
| 217 | subconstructor_handler => { is => 'ro' }, | ||||
| 218 | package => { is => 'bare' }, | ||||
| 219 | ); | ||||
| 220 | |||||
| 221 | 1; | ||||
# spent 12µs within Method::Generate::Constructor::CORE:sort which was called 6 times, avg 2µs/call:
# 2 times (7µs+0s) by Method::Generate::Constructor::_check_required at line 192, avg 4µs/call
# 2 times (2µs+0s) by Method::Generate::Constructor::_assign_new at line 177, avg 1µs/call
# 2 times (2µs+0s) by Method::Generate::Constructor::_assign_new at line 170, avg 1µs/call | |||||
# spent 9µs within Method::Generate::Constructor::CORE:subst which was called 13 times, avg 677ns/call:
# 13 times (9µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 12, avg 677ns/call |