Filename | /usr/share/perl5/Method/Generate/Constructor.pm |
Statements | Executed 349 statements in 2.08ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
2 | 1 | 1 | 204µs | 969µs | _assign_new | Method::Generate::Constructor::
2 | 1 | 1 | 130µs | 1.41ms | generate_method | Method::Generate::Constructor::
10 | 3 | 2 | 103µs | 112µs | register_attribute_specs | Method::Generate::Constructor::
2 | 1 | 1 | 65µs | 71µs | _check_required | Method::Generate::Constructor::
1 | 1 | 1 | 23µs | 83µs | BEGIN@3 | Method::Generate::Constructor::
11 | 1 | 1 | 23µs | 23µs | _cap_call | Method::Generate::Constructor::
1 | 1 | 1 | 21µs | 428µs | BEGIN@202 | Method::Generate::Constructor::
2 | 1 | 1 | 19µs | 2.76ms | __ANON__[:81] | Method::Generate::Constructor::
2 | 1 | 1 | 17µs | 81µs | install_delayed | Method::Generate::Constructor::
2 | 1 | 1 | 16µs | 28µs | _build_construction_string | Method::Generate::Constructor::
2 | 1 | 1 | 15µs | 43µs | construction_string | Method::Generate::Constructor::
2 | 1 | 1 | 15µs | 35µs | _handle_subconstructor | Method::Generate::Constructor::
6 | 3 | 1 | 12µs | 12µs | CORE:sort (opcode) | Method::Generate::Constructor::
1 | 1 | 1 | 10µs | 43µs | BEGIN@4 | Method::Generate::Constructor::
1 | 1 | 1 | 10µs | 32µs | BEGIN@5 | Method::Generate::Constructor::
1 | 1 | 1 | 9µs | 51µs | __ANON__[:202] | Method::Generate::Constructor::
13 | 1 | 1 | 9µs | 9µs | CORE:subst (opcode) | Method::Generate::Constructor::
1 | 1 | 1 | 8µs | 34µs | BEGIN@6 | Method::Generate::Constructor::
3 | 2 | 1 | 4µs | 4µs | accessor_generator | Method::Generate::Constructor::
2 | 1 | 1 | 4µs | 4µs | _generate_args | Method::Generate::Constructor::
0 | 0 | 0 | 0s | 0s | _generate_args_via_buildargs | Method::Generate::Constructor::
0 | 0 | 0 | 0s | 0s | all_attribute_specs | Method::Generate::Constructor::
0 | 0 | 0 | 0s | 0s | buildall_generator | Method::Generate::Constructor::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Method::Generate::Constructor; | ||||
2 | |||||
3 | 3 | 38µs | 3 | 143µs | # spent 83µs (23+60) within Method::Generate::Constructor::BEGIN@3 which was called:
# once (23µs+60µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 3 # spent 83µs making 1 call to Method::Generate::Constructor::BEGIN@3
# spent 37µs making 1 call to strictures::import
# spent 23µs making 1 call to strictures::VERSION |
4 | 2 | 63µs | 2 | 76µs | # spent 43µs (10+33) within Method::Generate::Constructor::BEGIN@4 which was called:
# once (10µs+33µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 4 # spent 43µs making 1 call to Method::Generate::Constructor::BEGIN@4
# spent 33µs making 1 call to Exporter::import |
5 | 2 | 53µs | 2 | 53µ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 | 1.14ms | 2 | 60µs | # spent 34µs (8+26) within Method::Generate::Constructor::BEGIN@6 which was called:
# once (8µs+26µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 6 # spent 34µs making 1 call to Method::Generate::Constructor::BEGIN@6
# spent 26µs making 1 call to Exporter::import |
7 | |||||
8 | # spent 112µs (103+9) within Method::Generate::Constructor::register_attribute_specs which was called 10 times, avg 11µs/call:
# 7 times (66µs+7µs) by Moo::has at line 52 of Moo.pm, avg 10µs/call
# 2 times (12µs+0s) by Moo::_constructor_maker_for at line 201 of Moo.pm, avg 6µs/call
# once (25µs+2µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 208 | ||||
9 | 10 | 9µs | my ($self, @new_specs) = @_; | ||
10 | 10 | 9µs | my $specs = $self->{attribute_specs}||={}; | ||
11 | 10 | 21µs | while (my ($name, $new_spec) = splice @new_specs, 0, 2) { | ||
12 | 13 | 35µs | 13 | 9µs | if ($name =~ s/^\+//) { # spent 9µs making 13 calls to Method::Generate::Constructor::CORE:subst, avg 692ns/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 | 13 | 7µs | 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 | 13 | 10µs | $new_spec->{index} = scalar keys %$specs | ||
40 | unless defined $new_spec->{index}; | ||||
41 | 13 | 8µs | $specs->{$name} = $new_spec; | ||
42 | } | ||||
43 | 10 | 25µs | $self; | ||
44 | } | ||||
45 | |||||
46 | sub all_attribute_specs { | ||||
47 | $_[0]->{attribute_specs} | ||||
48 | } | ||||
49 | |||||
50 | sub accessor_generator { | ||||
51 | 3 | 10µs | $_[0]->{accessor_generator} | ||
52 | } | ||||
53 | |||||
54 | # spent 43µs (15+28) within Method::Generate::Constructor::construction_string which was called 2 times, avg 22µs/call:
# 2 times (15µs+28µs) by Method::Generate::Constructor::generate_method at line 101, avg 22µs/call | ||||
55 | 2 | 600ns | my ($self) = @_; | ||
56 | 2 | 9µs | 2 | 28µs | $self->{construction_string} # spent 28µs making 2 calls to Method::Generate::Constructor::_build_construction_string, avg 14µ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 28µs (16+12) within Method::Generate::Constructor::_build_construction_string which was called 2 times, avg 14µs/call:
# 2 times (16µs+12µs) by Method::Generate::Constructor::construction_string at line 56, avg 14µs/call | ||||
66 | 2 | 600ns | my ($self) = @_; | ||
67 | 2 | 1µs | my $builder = $self->{construction_builder}; | ||
68 | 2 | 15µs | 3 | 12µs | $builder ? $self->$builder # spent 9µs making 1 call to Moo::__ANON__[Moo.pm:183]
# spent 2µs making 1 call to Method::Generate::Constructor::accessor_generator
# spent 2µs making 1 call to Method::Generate::Accessor::default_construction_string |
69 | : 'bless(' | ||||
70 | .$self->accessor_generator->default_construction_string | ||||
71 | .', $class);' | ||||
72 | } | ||||
73 | |||||
74 | # spent 81µs (17+64) within Method::Generate::Constructor::install_delayed which was called 2 times, avg 40µs/call:
# 2 times (17µs+64µs) by Moo::_constructor_maker_for at line 201 of Moo.pm, avg 40µs/call | ||||
75 | 2 | 700ns | my ($self) = @_; | ||
76 | 2 | 5µs | my $package = $self->{package}; | ||
77 | # spent 2.76ms (19µs+2.74) within Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:81] which was called 2 times, avg 1.38ms/call:
# 2 times (19µs+2.74ms) by Sub::Defer::undefer_sub at line 22 of Sub/Defer.pm, avg 1.38ms/call | ||||
78 | 2 | 16µs | 4 | 2.74ms | unquote_sub $self->generate_method( # spent 1.41ms making 2 calls to Method::Generate::Constructor::generate_method, avg 705µs/call
# spent 1.33ms making 2 calls to Sub::Quote::unquote_sub, avg 665µs/call |
79 | $package, 'new', $self->{attribute_specs}, { no_install => 1 } | ||||
80 | ) | ||||
81 | 2 | 8µs | 2 | 64µs | }; # spent 64µs making 2 calls to Sub::Defer::defer_sub, avg 32µs/call |
82 | 2 | 5µs | $self; | ||
83 | } | ||||
84 | |||||
85 | # spent 1.41ms (130µs+1.28) within Method::Generate::Constructor::generate_method which was called 2 times, avg 705µs/call:
# 2 times (130µs+1.28ms) by Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:81] at line 78, avg 705µs/call | ||||
86 | 2 | 2µs | my ($self, $into, $name, $spec, $quote_opts) = @_; | ||
87 | 2 | 23µs | foreach my $no_init (grep !exists($spec->{$_}{init_arg}), keys %$spec) { | ||
88 | 11 | 15µs | $spec->{$no_init}{init_arg} = $no_init; | ||
89 | } | ||||
90 | 2 | 3µs | local $self->{captures} = {}; | ||
91 | 2 | 1µs | my $body = ' my $class = shift;'."\n" | ||
92 | .' $class = ref($class) if ref($class);'."\n"; | ||||
93 | 2 | 4µs | 2 | 35µs | $body .= $self->_handle_subconstructor($into, $name); # spent 35µs making 2 calls to Method::Generate::Constructor::_handle_subconstructor, avg 17µs/call |
94 | 2 | 16µs | 2 | 9µs | my $into_buildargs = $into->can('BUILDARGS'); # spent 9µs making 2 calls to UNIVERSAL::can, avg 5µs/call |
95 | 2 | 3µs | if ( $into_buildargs && $into_buildargs != \&Moo::Object::BUILDARGS ) { | ||
96 | $body .= $self->_generate_args_via_buildargs; | ||||
97 | } else { | ||||
98 | 2 | 14µs | 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 | 4µs | 2 | 71µs | $body .= $self->_check_required($spec); # spent 71µs making 2 calls to Method::Generate::Constructor::_check_required, avg 36µs/call |
101 | 2 | 6µs | 2 | 43µs | $body .= ' my $new = '.$self->construction_string.";\n"; # spent 43µs making 2 calls to Method::Generate::Constructor::construction_string, avg 22µs/call |
102 | 2 | 6µs | 2 | 969µs | $body .= $self->_assign_new($spec); # spent 969µs making 2 calls to Method::Generate::Constructor::_assign_new, avg 484µs/call |
103 | 2 | 18µs | 2 | 11µs | if ($into->can('BUILD')) { # spent 11µs making 2 calls to UNIVERSAL::can, avg 6µs/call |
104 | $body .= $self->buildall_generator->buildall_body_for( | ||||
105 | $into, '$new', '$args' | ||||
106 | ); | ||||
107 | } | ||||
108 | 2 | 1µs | $body .= ' return $new;'."\n"; | ||
109 | 2 | 11µs | 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 | 12µs | 2 | 132µs | "${into}::${name}" => $body, # spent 132µs making 2 calls to Sub::Quote::quote_sub, avg 66µs/call |
115 | $self->{captures}, $quote_opts||{} | ||||
116 | ; | ||||
117 | } | ||||
118 | |||||
119 | # spent 35µs (15+20) within Method::Generate::Constructor::_handle_subconstructor which was called 2 times, avg 17µs/call:
# 2 times (15µs+20µs) by Method::Generate::Constructor::generate_method at line 93, avg 17µs/call | ||||
120 | 2 | 1µs | my ($self, $into, $name) = @_; | ||
121 | 2 | 17µs | 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 23µs within Method::Generate::Constructor::_cap_call which was called 11 times, avg 2µs/call:
# 11 times (23µs+0s) by Method::Generate::Constructor::_assign_new at line 181, avg 2µs/call | ||||
131 | 11 | 3µs | my ($self, $code, $captures) = @_; | ||
132 | 11 | 11µs | @{$self->{captures}}{keys %$captures} = values %$captures if $captures; | ||
133 | 11 | 18µs | $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 | 2 | 800ns | my ($self) = @_; | ||
146 | 2 | 7µs | 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 969µs (204+765) within Method::Generate::Constructor::_assign_new which was called 2 times, avg 484µs/call:
# 2 times (204µs+765µs) by Method::Generate::Constructor::generate_method at line 102, avg 484µs/call | ||||
167 | 2 | 900ns | my ($self, $spec) = @_; | ||
168 | 2 | 3µs | 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 | 2 | 700ns | my %test; | ||
170 | 2 | 16µs | 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 | 13 | 11µs | my $attr_spec = $spec->{$name}; | ||
172 | 13 | 21µs | 2 | 262µs | next NAME unless defined($attr_spec->{init_arg}) # spent 262µs making 2 calls to Method::Generate::Accessor::has_eager_default, avg 131µs/call |
173 | or $ag->has_eager_default($name, $attr_spec); | ||||
174 | 11 | 14µs | $test{$name} = $attr_spec->{init_arg}; | ||
175 | } | ||||
176 | 11 | 25µs | 11 | 35µs | join '', map { # spent 35µs making 11 calls to Sub::Quote::quotify, avg 3µs/call |
177 | 2 | 37µs | 2 | 3µs | my $arg_key = quotify($test{$_}); # spent 3µs making 2 calls to Method::Generate::Constructor::CORE:sort, avg 2µs/call |
178 | 11 | 6µs | my $test = "exists \$args->{$arg_key}"; | ||
179 | 11 | 4µs | my $source = "\$args->{$arg_key}"; | ||
180 | 11 | 3µs | my $attr_spec = $spec->{$_}; | ||
181 | 11 | 26µs | 22 | 461µs | $self->_cap_call($ag->generate_populate_set( # spent 438µs making 11 calls to Method::Generate::Accessor::generate_populate_set, avg 40µs/call
# spent 23µ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 71µs (65+7) within Method::Generate::Constructor::_check_required which was called 2 times, avg 36µs/call:
# 2 times (65µs+7µs) by Method::Generate::Constructor::generate_method at line 100, avg 36µs/call | ||||
188 | 2 | 900ns | my ($self, $spec) = @_; | ||
189 | my @required_init = | ||||
190 | map $spec->{$_}{init_arg}, | ||||
191 | grep { | ||||
192 | 15 | 56µs | 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 3µs/call |
193 | 13 | 8µs | $s{required} and not($s{builder} or $s{default}) | ||
194 | } sort keys %$spec; | ||||
195 | 2 | 4µs | return '' unless @required_init; | ||
196 | 1 | 6µs | ' 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 | 136µs | 4 | 876µs | # spent 51µs (9+42) within Method::Generate::Constructor::__ANON__[/usr/share/perl5/Method/Generate/Constructor.pm:202] which was called:
# once (9µs+42µs) by import::into at line 36 of Import/Into.pm
# spent 428µs (21+407) within Method::Generate::Constructor::BEGIN@202 which was called:
# once (21µs+407µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 202 # spent 428µs making 1 call to Method::Generate::Constructor::BEGIN@202
# spent 407µs making 1 call to Moo::import
# spent 29µs making 1 call to strictures::import
# spent 13µs making 1 call to Module::Runtime::use_module |
203 | # bootstrap our own constructor | ||||
204 | sub new { | ||||
205 | 1 | 300ns | my $class = shift; | ||
206 | 1 | 6µs | 1 | 6µs | bless $class->BUILDARGS(@_), $class; # spent 6µs making 1 call to Moo::Object::BUILDARGS |
207 | } | ||||
208 | 1 | 9µs | 2 | 202µs | Moo->_constructor_maker_for(__PACKAGE__) # spent 175µs making 1 call to Moo::_constructor_maker_for
# spent 27µ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 | 4µs | 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 3µs/call
# 2 times (3µs+0s) by Method::Generate::Constructor::_assign_new at line 177, avg 2µ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 692ns/call:
# 13 times (9µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 12, avg 692ns/call |