← Index
NYTProf Performance Profile   « line view »
For starman worker -M FindBin --max-requests 50 --workers 2 --user=kohadev-koha --group kohadev-koha --pid /var/run/koha/kohadev/plack.pid --daemonize --access-log /var/log/koha/kohadev/plack.log --error-log /var/log/koha/kohadev/plack-error.log -E deployment --socket /var/run/koha/kohadev/plack.sock /etc/koha/sites/kohadev/plack.psgi
  Run on Fri Jan 8 14:31:06 2016
Reported on Fri Jan 8 14:33:29 2016

Filename/usr/share/perl5/Method/Generate/Accessor.pm
StatementsExecuted 0 statements in 0s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
711235µs4.94msMethod::Generate::Accessor::::generate_methodMethod::Generate::Accessor::generate_method
1111105µs371µsMethod::Generate::Accessor::::_generate_populate_setMethod::Generate::Accessor::_generate_populate_set
165188µs223µsMethod::Generate::Accessor::::_generate_simple_setMethod::Generate::Accessor::_generate_simple_set
111165µs436µsMethod::Generate::Accessor::::generate_populate_setMethod::Generate::Accessor::generate_populate_set
161152µs89µsMethod::Generate::Accessor::::_generate_core_setMethod::Generate::Accessor::_generate_core_set
43148µs133µsMethod::Generate::Accessor::::_generate_call_codeMethod::Generate::Accessor::_generate_call_code
41145µs3.95msMethod::Generate::Accessor::::_generate_xsMethod::Generate::Accessor::_generate_xs
31137µs180µsMethod::Generate::Accessor::::_generate_use_defaultMethod::Generate::Accessor::_generate_use_default
32132µs258µsMethod::Generate::Accessor::::_generate_getMethod::Generate::Accessor::_generate_get
22129µs96µsMethod::Generate::Accessor::::_generate_setMethod::Generate::Accessor::_generate_set
11127µs100µsMethod::Generate::Accessor::::BEGIN@11Method::Generate::Accessor::BEGIN@11
32125µs31µsMethod::Generate::Accessor::::_validate_codulatableMethod::Generate::Accessor::_validate_codulatable
132223µs23µsMethod::Generate::Accessor::::has_eager_defaultMethod::Generate::Accessor::has_eager_default
11121µs42µsMethod::Generate::Accessor::::_wrap_attr_exceptionMethod::Generate::Accessor::_wrap_attr_exception
62120µs39µsMethod::Generate::Accessor::::_generate_simple_getMethod::Generate::Accessor::_generate_simple_get
42119µs95µsMethod::Generate::Accessor::::_generate_get_defaultMethod::Generate::Accessor::_generate_get_default
11117µs56µsMethod::Generate::Accessor::::BEGIN@3Method::Generate::Accessor::BEGIN@3
103117µs17µsMethod::Generate::Accessor::::is_simple_getMethod::Generate::Accessor::is_simple_get
11117µs17µsMethod::Generate::Accessor::::CORE:regcompMethod::Generate::Accessor::CORE:regcomp (opcode)
11113µs75µsMethod::Generate::Accessor::::BEGIN@4Method::Generate::Accessor::BEGIN@4
31113µs21µsMethod::Generate::Accessor::::_generate_simple_hasMethod::Generate::Accessor::_generate_simple_has
11110µs173µsMethod::Generate::Accessor::::_generate_getsetMethod::Generate::Accessor::_generate_getset
11110µs36µsMethod::Generate::Accessor::::BEGIN@7Method::Generate::Accessor::BEGIN@7
11110µs88µsMethod::Generate::Accessor::::_generate_isa_checkMethod::Generate::Accessor::_generate_isa_check
1119µs21µsMethod::Generate::Accessor::::BEGIN@10Method::Generate::Accessor::BEGIN@10
1119µs27µsMethod::Generate::Accessor::::BEGIN@8Method::Generate::Accessor::BEGIN@8
3218µs8µsMethod::Generate::Accessor::::is_simple_setMethod::Generate::Accessor::is_simple_set
1117µs10µsMethod::Generate::Accessor::::_attr_descMethod::Generate::Accessor::_attr_desc
1116µs10µsMethod::Generate::Accessor::::_generate_simple_clearMethod::Generate::Accessor::_generate_simple_clear
1116µs31µsMethod::Generate::Accessor::::_generate_triggerMethod::Generate::Accessor::_generate_trigger
1114µs4µsMethod::Generate::Accessor::::BEGIN@9Method::Generate::Accessor::BEGIN@9
1114µs4µsMethod::Generate::Accessor::::BEGIN@5Method::Generate::Accessor::BEGIN@5
7112µs2µsMethod::Generate::Accessor::::CORE:substMethod::Generate::Accessor::CORE:subst (opcode)
1112µs2µsMethod::Generate::Accessor::::CORE:qrMethod::Generate::Accessor::CORE:qr (opcode)
1112µs2µsMethod::Generate::Accessor::::default_construction_stringMethod::Generate::Accessor::default_construction_string
0000s0sMethod::Generate::Accessor::::__ANON__[:78]Method::Generate::Accessor::__ANON__[:78]
0000s0sMethod::Generate::Accessor::::_die_overwriteMethod::Generate::Accessor::_die_overwrite
0000s0sMethod::Generate::Accessor::::_generate_asserterMethod::Generate::Accessor::_generate_asserter
0000s0sMethod::Generate::Accessor::::_generate_coerceMethod::Generate::Accessor::_generate_coerce
0000s0sMethod::Generate::Accessor::::_generate_delegationMethod::Generate::Accessor::_generate_delegation
0000s0sMethod::Generate::Accessor::::_sanitize_nameMethod::Generate::Accessor::_sanitize_name
0000s0sMethod::Generate::Accessor::::generate_coerceMethod::Generate::Accessor::generate_coerce
0000s0sMethod::Generate::Accessor::::generate_get_defaultMethod::Generate::Accessor::generate_get_default
0000s0sMethod::Generate::Accessor::::generate_isa_checkMethod::Generate::Accessor::generate_isa_check
0000s0sMethod::Generate::Accessor::::generate_simple_getMethod::Generate::Accessor::generate_simple_get
0000s0sMethod::Generate::Accessor::::generate_simple_hasMethod::Generate::Accessor::generate_simple_has
0000s0sMethod::Generate::Accessor::::generate_triggerMethod::Generate::Accessor::generate_trigger
0000s0sMethod::Generate::Accessor::::generate_use_defaultMethod::Generate::Accessor::generate_use_default
0000s0sMethod::Generate::Accessor::::is_simple_attributeMethod::Generate::Accessor::is_simple_attribute
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Method::Generate::Accessor;
2
3396µs
# spent 56µs (17+39) within Method::Generate::Accessor::BEGIN@3 which was called: # once (17µs+39µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 3
use strictures 1;
# spent 56µs making 1 call to Method::Generate::Accessor::BEGIN@3 # spent 20µs making 1 call to strictures::import # spent 19µs making 1 call to strictures::VERSION
42136µs
# spent 75µs (13+61) within Method::Generate::Accessor::BEGIN@4 which was called: # once (13µs+61µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 4
use Moo::_Utils;
# spent 75µs making 1 call to Method::Generate::Accessor::BEGIN@4 # spent 61µs making 1 call to Exporter::import
514µs
# spent 4µs within Method::Generate::Accessor::BEGIN@5 which was called: # once (4µs+0s) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 5
use Moo::Object ();
# spent 4µs making 1 call to Method::Generate::Accessor::BEGIN@5
6our @ISA = qw(Moo::Object);
7262µs
# spent 36µs (10+26) within Method::Generate::Accessor::BEGIN@7 which was called: # once (10µs+26µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 7
use Sub::Quote qw(quote_sub quoted_from_sub quotify);
# spent 36µs making 1 call to Method::Generate::Accessor::BEGIN@7 # spent 26µs making 1 call to Exporter::import
8246µs
# spent 27µs (9+18) within Method::Generate::Accessor::BEGIN@8 which was called: # once (9µs+18µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 8
use Scalar::Util 'blessed';
# spent 27µs making 1 call to Method::Generate::Accessor::BEGIN@8 # spent 18µs making 1 call to Exporter::import
914µs
# spent 4µs within Method::Generate::Accessor::BEGIN@9 which was called: # once (4µs+0s) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 9
use overload ();
# spent 4µs making 1 call to Method::Generate::Accessor::BEGIN@9
10234µs
# spent 21µs (9+12) within Method::Generate::Accessor::BEGIN@10 which was called: # once (9µs+12µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 10
use Module::Runtime qw(use_module);
# spent 21µs making 1 call to Method::Generate::Accessor::BEGIN@10 # spent 12µs making 1 call to Module::Runtime::import
11
# spent 100µs (27+73) within Method::Generate::Accessor::BEGIN@11 which was called: # once (27µs+73µs) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 23
BEGIN {
12 our $CAN_HAZ_XS =
13 !$ENV{MOO_XS_DISABLE}
14 &&
15 _maybe_load_module('Class::XSAccessor')
16 &&
17269µs (eval { Class::XSAccessor->VERSION('1.07') })
# spent 61µs making 1 call to Moo::_Utils::_maybe_load_module # spent 8µs making 1 call to version::vxs::_VERSION
18 ;
19 our $CAN_HAZ_XS_PRED =
20 $CAN_HAZ_XS &&
2114µs (eval { Class::XSAccessor->VERSION('1.17') })
# spent 4µs making 1 call to version::vxs::_VERSION
22 ;
231100µs}
# spent 100µs making 1 call to Method::Generate::Accessor::BEGIN@11
24
25219µsmy $module_name_only = qr/\A$Module::Runtime::module_name_rx\z/;
# spent 17µs making 1 call to Method::Generate::Accessor::CORE:regcomp # spent 2µs making 1 call to Method::Generate::Accessor::CORE:qr
26
27sub _die_overwrite
28{
29 my ($pkg, $method, $type) = @_;
30 die "You cannot overwrite a locally defined method ($method) with "
31 . ( $type || 'an accessor' );
32}
33
34
# spent 4.94ms (235µs+4.70) within Method::Generate::Accessor::generate_method which was called 7 times, avg 706µs/call: # 7 times (235µs+4.70ms) by Moo::has at line 54 of Moo.pm, avg 706µs/call
sub generate_method {
35 my ($self, $into, $name, $spec, $quote_opts) = @_;
3672µs $spec->{allow_overwrite}++ if $name =~ s/^\+//;
# spent 2µs making 7 calls to Method::Generate::Accessor::CORE:subst, avg 329ns/call
37 die "Must have an is" unless my $is = $spec->{is};
38 if ($is eq 'ro') {
39 $spec->{reader} = $name unless exists $spec->{reader};
40 } elsif ($is eq 'rw') {
41 $spec->{accessor} = $name unless exists $spec->{accessor}
42 or ( $spec->{reader} and $spec->{writer} );
43 } elsif ($is eq 'lazy') {
44 $spec->{reader} = $name unless exists $spec->{reader};
45 $spec->{lazy} = 1;
46 $spec->{builder} ||= '_build_'.$name unless exists $spec->{default};
47 } elsif ($is eq 'rwp') {
48 $spec->{reader} = $name unless exists $spec->{reader};
49 $spec->{writer} = "_set_${name}" unless exists $spec->{writer};
50 } elsif ($is ne 'bare') {
51 die "Unknown is ${is}";
52 }
53 if (exists $spec->{builder}) {
54 if(ref $spec->{builder}) {
55 $self->_validate_codulatable('builder', $spec->{builder},
56 "$into->$name", 'or a method name');
57 $spec->{builder_sub} = $spec->{builder};
58 $spec->{builder} = 1;
59 }
60 $spec->{builder} = '_build_'.$name if ($spec->{builder}||0) eq 1;
61 die "Invalid builder for $into->$name - not a valid method name"
62 if $spec->{builder} !~ $module_name_only;
63 }
64 if (($spec->{predicate}||0) eq 1) {
65 $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}";
66 }
67 if (($spec->{clearer}||0) eq 1) {
68 $spec->{clearer} = $name =~ /^_/ ? "_clear${name}" : "clear_${name}";
69 }
70 if (($spec->{trigger}||0) eq 1) {
71 $spec->{trigger} = quote_sub('shift->_trigger_'.$name.'(@_)');
72 }
73 if (($spec->{coerce}||0) eq 1) {
74 my $isa = $spec->{isa};
75 if (blessed $isa and $isa->can('coercion')) {
76 $spec->{coerce} = $isa->coercion;
77 } elsif (blessed $isa and $isa->can('coerce')) {
78 $spec->{coerce} = sub { $isa->coerce(@_) };
79 } else {
80 die "Invalid coercion for $into->$name - no appropriate type constraint";
81 }
82 }
83
84 for my $setting (qw( isa coerce )) {
85 next if !exists $spec->{$setting};
86114µs $self->_validate_codulatable($setting, $spec->{$setting}, "$into->$name");
# spent 14µs making 1 call to Method::Generate::Accessor::_validate_codulatable
87 }
88
89217µs if (exists $spec->{default}) {
# spent 17µs making 2 calls to Method::Generate::Accessor::_validate_codulatable, avg 8µs/call
90 if (ref $spec->{default}) {
91 $self->_validate_codulatable('default', $spec->{default}, "$into->$name",
92 'or a non-ref');
93 }
94 }
95
96 if (exists $spec->{moosify}) {
97 if (ref $spec->{moosify} ne 'ARRAY') {
98 $spec->{moosify} = [$spec->{moosify}];
99 }
100
101 for my $spec (@{$spec->{moosify}}) {
102 $self->_validate_codulatable('moosify', $spec, "$into->$name");
103 }
104 }
105
106 my %methods;
107 if (my $reader = $spec->{reader}) {
108 _die_overwrite($into, $reader, 'a reader')
109628µs if !$spec->{allow_overwrite} && *{_getglob("${into}::${reader}")}{CODE};
# spent 28µs making 6 calls to Moo::_Utils::_getglob, avg 5µs/call
110103.96ms if (our $CAN_HAZ_XS && $self->is_simple_get($name, $spec)) {
# spent 3.95ms making 4 calls to Method::Generate::Accessor::_generate_xs, avg 987µs/call # spent 11µs making 6 calls to Method::Generate::Accessor::is_simple_get, avg 2µs/call
111 $methods{$reader} = $self->_generate_xs(
112 getters => $into, $reader, $name, $spec
113 );
114 } else {
115 $self->{captures} = {};
1164248µs $methods{$reader} =
# spent 125µs making 2 calls to Method::Generate::Accessor::_generate_get, avg 62µs/call # spent 123µs making 2 calls to Sub::Quote::quote_sub, avg 62µs/call
117 quote_sub "${into}::${reader}"
118 => ' die "'.$reader.' is a read-only accessor" if @_ > 1;'."\n"
119 .$self->_generate_get($name, $spec)
120 => delete $self->{captures}
121 ;
122 }
123 }
124 if (my $accessor = $spec->{accessor}) {
125 _die_overwrite($into, $accessor, 'an accessor')
12614µs if !$spec->{allow_overwrite} && *{_getglob("${into}::${accessor}")}{CODE};
# spent 4µs making 1 call to Moo::_Utils::_getglob
12712µs if (
# spent 2µs making 1 call to Method::Generate::Accessor::is_simple_get
128 our $CAN_HAZ_XS
129 && $self->is_simple_get($name, $spec)
130 && $self->is_simple_set($name, $spec)
131 ) {
132 $methods{$accessor} = $self->_generate_xs(
133 accessors => $into, $accessor, $name, $spec
134 );
135 } else {
136 $self->{captures} = {};
1372236µs $methods{$accessor} =
# spent 173µs making 1 call to Method::Generate::Accessor::_generate_getset # spent 63µs making 1 call to Sub::Quote::quote_sub
138 quote_sub "${into}::${accessor}"
139 => $self->_generate_getset($name, $spec)
140 => delete $self->{captures}
141 ;
142 }
143 }
144 if (my $writer = $spec->{writer}) {
145 _die_overwrite($into, $writer, 'a writer')
14613µs if !$spec->{allow_overwrite} && *{_getglob("${into}::${writer}")}{CODE};
# spent 3µs making 1 call to Moo::_Utils::_getglob
14713µs if (
# spent 3µs making 1 call to Method::Generate::Accessor::is_simple_set
148 our $CAN_HAZ_XS
149 && $self->is_simple_set($name, $spec)
150 ) {
151 $methods{$writer} = $self->_generate_xs(
152 setters => $into, $writer, $name, $spec
153 );
154 } else {
155 $self->{captures} = {};
1562123µs $methods{$writer} =
# spent 66µs making 1 call to Method::Generate::Accessor::_generate_set # spent 57µs making 1 call to Sub::Quote::quote_sub
157 quote_sub "${into}::${writer}"
158 => $self->_generate_set($name, $spec)
159 => delete $self->{captures}
160 ;
161 }
162 }
163 if (my $pred = $spec->{predicate}) {
164 _die_overwrite($into, $pred, 'a predicate')
165 if !$spec->{allow_overwrite} && *{_getglob("${into}::${pred}")}{CODE};
166 if (our $CAN_HAZ_XS && our $CAN_HAZ_XS_PRED) {
167 $methods{$pred} = $self->_generate_xs(
168 exists_predicates => $into, $pred, $name, $spec
169 );
170 } else {
171 $methods{$pred} =
172 quote_sub "${into}::${pred}" =>
173 ' '.$self->_generate_simple_has('$_[0]', $name, $spec)."\n"
174 ;
175 }
176 }
177 if (my $pred = $spec->{builder_sub}) {
178 _install_coderef( "${into}::$spec->{builder}" => $spec->{builder_sub} );
179 }
180 if (my $cl = $spec->{clearer}) {
181 _die_overwrite($into, $cl, 'a clearer')
18213µs if !$spec->{allow_overwrite} && *{_getglob("${into}::${cl}")}{CODE};
# spent 3µs making 1 call to Moo::_Utils::_getglob
183260µs $methods{$cl} =
# spent 51µs making 1 call to Sub::Quote::quote_sub # spent 10µs making 1 call to Method::Generate::Accessor::_generate_simple_clear
184 quote_sub "${into}::${cl}" =>
185 $self->_generate_simple_clear('$_[0]', $name, $spec)."\n"
186 ;
187 }
188 if (my $hspec = $spec->{handles}) {
189 my $asserter = $spec->{asserter} ||= '_assert_'.$name;
190 my @specs = do {
191 if (ref($hspec) eq 'ARRAY') {
192 map [ $_ => $_ ], @$hspec;
193 } elsif (ref($hspec) eq 'HASH') {
194 map [ $_ => ref($hspec->{$_}) ? @{$hspec->{$_}} : $hspec->{$_} ],
195 keys %$hspec;
196 } elsif (!ref($hspec)) {
197 map [ $_ => $_ ], use_module('Moo::Role')->methods_provided_by(use_module($hspec))
198 } else {
199 die "You gave me a handles of ${hspec} and I have no idea why";
200 }
201 };
202 foreach my $delegation_spec (@specs) {
203 my ($proxy, $target, @args) = @$delegation_spec;
204 _die_overwrite($into, $proxy, 'a delegation')
205 if !$spec->{allow_overwrite} && *{_getglob("${into}::${proxy}")}{CODE};
206 $self->{captures} = {};
207 $methods{$proxy} =
208 quote_sub "${into}::${proxy}" =>
209 $self->_generate_delegation($asserter, $target, \@args),
210 delete $self->{captures}
211 ;
212 }
213 }
214 if (my $asserter = $spec->{asserter}) {
215 $self->{captures} = {};
216
217
218 $methods{$asserter} =
219 quote_sub "${into}::${asserter}" =>
220 $self->_generate_asserter($name, $spec),
221 delete $self->{captures};
222 }
223 \%methods;
224}
225
226sub is_simple_attribute {
227 my ($self, $name, $spec) = @_;
228 # clearer doesn't have to be listed because it doesn't
229 # affect whether defined/exists makes a difference
230 !grep $spec->{$_},
231 qw(lazy default builder coerce isa trigger predicate weak_ref);
232}
233
234
# spent 17µs within Method::Generate::Accessor::is_simple_get which was called 10 times, avg 2µs/call: # 6 times (11µs+0s) by Method::Generate::Accessor::generate_method at line 110, avg 2µs/call # 3 times (4µs+0s) by Method::Generate::Accessor::_generate_get at line 252, avg 1µs/call # once (2µs+0s) by Method::Generate::Accessor::generate_method at line 127
sub is_simple_get {
235 my ($self, $name, $spec) = @_;
236 !($spec->{lazy} and (exists $spec->{default} or $spec->{builder}));
237}
238
239
# spent 8µs within Method::Generate::Accessor::is_simple_set which was called 3 times, avg 3µs/call: # 2 times (5µs+0s) by Method::Generate::Accessor::_generate_set at line 340, avg 3µs/call # once (3µs+0s) by Method::Generate::Accessor::generate_method at line 147
sub is_simple_set {
240 my ($self, $name, $spec) = @_;
241 !grep $spec->{$_}, qw(coerce isa trigger weak_ref);
242}
243
244
# spent 23µs within Method::Generate::Accessor::has_eager_default which was called 13 times, avg 2µs/call: # 11 times (17µs+0s) by Method::Generate::Accessor::_generate_populate_set at line 497, avg 2µs/call # 2 times (6µs+0s) by Method::Generate::Constructor::_assign_new at line 172 of Method/Generate/Constructor.pm, avg 3µs/call
sub has_eager_default {
245 my ($self, $name, $spec) = @_;
246 (!$spec->{lazy} and (exists $spec->{default} or $spec->{builder}));
247}
248
249
# spent 258µs (32+226) within Method::Generate::Accessor::_generate_get which was called 3 times, avg 86µs/call: # 2 times (15µs+110µs) by Method::Generate::Accessor::generate_method at line 116, avg 62µs/call # once (16µs+116µs) by Method::Generate::Accessor::_generate_getset at line 609
sub _generate_get {
250 my ($self, $name, $spec) = @_;
251321µs my $simple = $self->_generate_simple_get('$_[0]', $name, $spec);
# spent 21µs making 3 calls to Method::Generate::Accessor::_generate_simple_get, avg 7µs/call
25234µs if ($self->is_simple_get($name, $spec)) {
# spent 4µs making 3 calls to Method::Generate::Accessor::is_simple_get, avg 1µs/call
253 $simple;
254 } else {
2556200µs $self->_generate_use_default(
# spent 180µs making 3 calls to Method::Generate::Accessor::_generate_use_default, avg 60µs/call # spent 21µs making 3 calls to Method::Generate::Accessor::_generate_simple_has, avg 7µs/call
256 '$_[0]', $name, $spec,
257 $self->_generate_simple_has('$_[0]', $name, $spec),
258 );
259 }
260}
261
262sub generate_simple_has {
263 my $self = shift;
264 $self->{captures} = {};
265 my $code = $self->_generate_simple_has(@_);
266 ($code, delete $self->{captures});
267}
268
269
# spent 21µs (13+8) within Method::Generate::Accessor::_generate_simple_has which was called 3 times, avg 7µs/call: # 3 times (13µs+8µs) by Method::Generate::Accessor::_generate_get at line 255, avg 7µs/call
sub _generate_simple_has {
270 my ($self, $me, $name) = @_;
27138µs "exists ${me}->{${\quotify $name}}";
# spent 8µs making 3 calls to Sub::Quote::quotify, avg 3µs/call
272}
273
274
# spent 10µs (6+3) within Method::Generate::Accessor::_generate_simple_clear which was called: # once (6µs+3µs) by Method::Generate::Accessor::generate_method at line 183
sub _generate_simple_clear {
275 my ($self, $me, $name) = @_;
27613µs " delete ${me}->{${\quotify $name}}\n"
# spent 3µs making 1 call to Sub::Quote::quotify
277}
278
279sub generate_get_default {
280 my $self = shift;
281 $self->{captures} = {};
282 my $code = $self->_generate_get_default(@_);
283 ($code, delete $self->{captures});
284}
285
286sub generate_use_default {
287 my $self = shift;
288 $self->{captures} = {};
289 my $code = $self->_generate_use_default(@_);
290 ($code, delete $self->{captures});
291}
292
293
# spent 180µs (37+142) within Method::Generate::Accessor::_generate_use_default which was called 3 times, avg 60µs/call: # 3 times (37µs+142µs) by Method::Generate::Accessor::_generate_get at line 255, avg 60µs/call
sub _generate_use_default {
294 my ($self, $me, $name, $spec, $test) = @_;
295388µs my $get_value = $self->_generate_get_default($me, $name, $spec);
# spent 88µs making 3 calls to Method::Generate::Accessor::_generate_get_default, avg 29µs/call
296 if ($spec->{coerce}) {
297 $get_value = $self->_generate_coerce(
298 $name, $get_value,
299 $spec->{coerce}
300 )
301 }
302655µs $test." ? \n"
# spent 38µs making 3 calls to Method::Generate::Accessor::_generate_simple_set, avg 13µs/call # spent 17µs making 3 calls to Method::Generate::Accessor::_generate_simple_get, avg 6µs/call
303 .$self->_generate_simple_get($me, $name, $spec)."\n:"
304 .($spec->{isa} ?
305 " do {\n my \$value = ".$get_value.";\n"
306 ." ".$self->_generate_isa_check($name, '$value', $spec->{isa}).";\n"
307 ." ".$self->_generate_simple_set($me, $name, $spec, '$value')."\n"
308 ." }\n"
309 : ' ('.$self->_generate_simple_set($me, $name, $spec, $get_value).")\n"
310 );
311}
312
313
# spent 95µs (19+76) within Method::Generate::Accessor::_generate_get_default which was called 4 times, avg 24µs/call: # 3 times (14µs+74µs) by Method::Generate::Accessor::_generate_use_default at line 295, avg 29µs/call # once (5µs+3µs) by Method::Generate::Accessor::_generate_populate_set at line 499
sub _generate_get_default {
314 my ($self, $me, $name, $spec) = @_;
315476µs if (exists $spec->{default}) {
# spent 71µs making 2 calls to Method::Generate::Accessor::_generate_call_code, avg 36µs/call # spent 5µs making 2 calls to Sub::Quote::quotify, avg 3µs/call
316 ref $spec->{default}
317 ? $self->_generate_call_code($name, 'default', $me, $spec->{default})
318 : quotify $spec->{default};
319 }
320 else {
321 "${me}->${\$spec->{builder}}"
322 }
323}
324
325sub generate_simple_get {
326 my ($self, @args) = @_;
327 $self->{captures} = {};
328 my $code = $self->_generate_simple_get(@args);
329 ($code, delete $self->{captures});
330}
331
332
# spent 39µs (20+19) within Method::Generate::Accessor::_generate_simple_get which was called 6 times, avg 6µs/call: # 3 times (11µs+10µs) by Method::Generate::Accessor::_generate_get at line 251, avg 7µs/call # 3 times (8µs+9µs) by Method::Generate::Accessor::_generate_use_default at line 302, avg 6µs/call
sub _generate_simple_get {
333 my ($self, $me, $name) = @_;
334619µs my $name_str = quotify $name;
# spent 19µs making 6 calls to Sub::Quote::quotify, avg 3µs/call
335 "${me}->{${name_str}}";
336}
337
338
# spent 96µs (29+67) within Method::Generate::Accessor::_generate_set which was called 2 times, avg 48µs/call: # once (20µs+46µs) by Method::Generate::Accessor::generate_method at line 156 # once (9µs+21µs) by Method::Generate::Accessor::_generate_getset at line 609
sub _generate_set {
339 my ($self, $name, $spec) = @_;
340323µs if ($self->is_simple_set($name, $spec)) {
# spent 18µs making 1 call to Method::Generate::Accessor::_generate_simple_set # spent 5µs making 2 calls to Method::Generate::Accessor::is_simple_set, avg 3µs/call
341 $self->_generate_simple_set('$_[0]', $name, $spec, '$_[1]');
342 } else {
343 my ($coerce, $trigger, $isa_check) = @{$spec}{qw(coerce trigger isa)};
344 my $value_store = '$_[0]';
345 my $code;
346 if ($coerce) {
347 $value_store = '$value';
348 $code = "do { my (\$self, \$value) = \@_;\n"
349 ." \$value = "
350 .$self->_generate_coerce($name, $value_store, $coerce).";\n";
351 }
352 else {
353 $code = "do { my \$self = shift;\n";
354 }
355 if ($isa_check) {
356 $code .=
357 " ".$self->_generate_isa_check($name, $value_store, $isa_check).";\n";
358 }
359113µs my $simple = $self->_generate_simple_set('$self', $name, $spec, $value_store);
# spent 13µs making 1 call to Method::Generate::Accessor::_generate_simple_set
360 if ($trigger) {
361131µs my $fire = $self->_generate_trigger($name, '$self', $value_store, $trigger);
# spent 31µs making 1 call to Method::Generate::Accessor::_generate_trigger
362 $code .=
363 " ".$simple.";\n ".$fire.";\n"
364 ." $value_store;\n";
365 } else {
366 $code .= " ".$simple.";\n";
367 }
368 $code .= " }";
369 $code;
370 }
371}
372
373sub generate_coerce {
374 my $self = shift;
375 $self->{captures} = {};
376 my $code = $self->_generate_coerce(@_);
377 ($code, delete $self->{captures});
378}
379
380
# spent 10µs (7+3) within Method::Generate::Accessor::_attr_desc which was called: # once (7µs+3µs) by Method::Generate::Accessor::_wrap_attr_exception at line 418
sub _attr_desc {
381 my ($name, $init_arg) = @_;
38213µs return quotify($name) if !defined($init_arg) or $init_arg eq $name;
# spent 3µs making 1 call to Sub::Quote::quotify
383 return quotify($name).' (constructor argument: '.quotify($init_arg).')';
384}
385
386sub _generate_coerce {
387 my ($self, $name, $value, $coerce, $init_arg) = @_;
388 $self->_wrap_attr_exception(
389 $name,
390 "coercion",
391 $init_arg,
392 $self->_generate_call_code($name, 'coerce', "${value}", $coerce),
393 1,
394 );
395}
396
397sub generate_trigger {
398 my $self = shift;
399 $self->{captures} = {};
400 my $code = $self->_generate_trigger(@_);
401 ($code, delete $self->{captures});
402}
403
404
# spent 31µs (6+26) within Method::Generate::Accessor::_generate_trigger which was called: # once (6µs+26µs) by Method::Generate::Accessor::_generate_set at line 361
sub _generate_trigger {
405 my ($self, $name, $obj, $value, $trigger) = @_;
406126µs $self->_generate_call_code($name, 'trigger', "${obj}, ${value}", $trigger);
# spent 26µs making 1 call to Method::Generate::Accessor::_generate_call_code
407}
408
409sub generate_isa_check {
410 my ($self, @args) = @_;
411 $self->{captures} = {};
412 my $code = $self->_generate_isa_check(@args);
413 ($code, delete $self->{captures});
414}
415
416
# spent 42µs (21+20) within Method::Generate::Accessor::_wrap_attr_exception which was called: # once (21µs+20µs) by Method::Generate::Accessor::_generate_isa_check at line 449
sub _wrap_attr_exception {
417 my ($self, $name, $step, $arg, $code, $want_return) = @_;
418213µs my $prefix = quotify("${step} for "._attr_desc($name, $arg).' failed: ');
# spent 10µs making 1 call to Method::Generate::Accessor::_attr_desc # spent 3µs making 1 call to Sub::Quote::quotify
41937µs "do {\n"
# spent 7µs making 3 calls to Sub::Quote::quotify, avg 2µs/call
420 .' local $Method::Generate::Accessor::CurrentAttribute = {'."\n"
421 .' init_arg => '.quotify($arg).",\n"
422 .' name => '.quotify($name).",\n"
423 .' step => '.quotify($step).",\n"
424 ." };\n"
425 .($want_return ? ' my $_return;'."\n" : '')
426 .' my $_error;'."\n"
427 ." {\n"
428 .' my $_old_error = $@;'."\n"
429 ." if (!eval {\n"
430 .' $@ = $_old_error;'."\n"
431 .($want_return ? ' $_return ='."\n" : '')
432 .' '.$code.";\n"
433 ." 1;\n"
434 ." }) {\n"
435 .' $_error = $@;'."\n"
436 .' if (!ref $_error) {'."\n"
437 .' $_error = '.$prefix.'.$_error;'."\n"
438 ." }\n"
439 ." }\n"
440 .' $@ = $_old_error;'."\n"
441 ." }\n"
442 .' die $_error if $_error;'."\n"
443 .($want_return ? ' $_return;'."\n" : '')
444 ."}\n"
445}
446
447
# spent 88µs (10+78) within Method::Generate::Accessor::_generate_isa_check which was called: # once (10µs+78µs) by Method::Generate::Accessor::_generate_populate_set at line 533
sub _generate_isa_check {
448 my ($self, $name, $value, $check, $init_arg) = @_;
449278µs $self->_wrap_attr_exception(
# spent 42µs making 1 call to Method::Generate::Accessor::_wrap_attr_exception # spent 36µs making 1 call to Method::Generate::Accessor::_generate_call_code
450 $name,
451 "isa check",
452 $init_arg,
453 $self->_generate_call_code($name, 'isa_check', $value, $check)
454 );
455}
456
457
# spent 133µs (48+85) within Method::Generate::Accessor::_generate_call_code which was called 4 times, avg 33µs/call: # 2 times (28µs+43µs) by Method::Generate::Accessor::_generate_get_default at line 315, avg 36µs/call # once (12µs+25µs) by Method::Generate::Accessor::_generate_isa_check at line 449 # once (8µs+18µs) by Method::Generate::Accessor::_generate_trigger at line 406
sub _generate_call_code {
458 my ($self, $name, $type, $values, $sub) = @_;
45944µs $sub = \&{$sub} if blessed($sub); # coderef if blessed
# spent 4µs making 4 calls to Scalar::Util::blessed, avg 875ns/call
460422µs if (my $quoted = quoted_from_sub($sub)) {
# spent 22µs making 4 calls to Sub::Quote::quoted_from_sub, avg 6µs/call
461 my $local = 1;
462 if ($values eq '@_' || $values eq '$_[0]') {
463 $local = 0;
464 $values = '@_';
465 }
466 my $code = $quoted->[1];
467 if (my $captures = $quoted->[2]) {
468 my $cap_name = qq{\$${type}_captures_for_}.$self->_sanitize_name($name);
469 $self->{captures}->{$cap_name} = \$captures;
470 Sub::Quote::inlinify($code, $values,
471 Sub::Quote::capture_unroll($cap_name, $captures, 6), $local);
472 } else {
473460µs Sub::Quote::inlinify($code, $values, undef, $local);
# spent 60µs making 4 calls to Sub::Quote::inlinify, avg 15µs/call
474 }
475 } else {
476 my $cap_name = qq{\$${type}_for_}.$self->_sanitize_name($name);
477 $self->{captures}->{$cap_name} = \$sub;
478 "${cap_name}->(${values})";
479 }
480}
481
482sub _sanitize_name {
483 my ($self, $name) = @_;
484 $name =~ s/([_\W])/sprintf('_%x', ord($1))/ge;
485 $name;
486}
487
488
# spent 436µs (65+371) within Method::Generate::Accessor::generate_populate_set which was called 11 times, avg 40µs/call: # 11 times (65µs+371µs) by Method::Generate::Constructor::_assign_new at line 181 of Method/Generate/Constructor.pm, avg 40µs/call
sub generate_populate_set {
489 my $self = shift;
490 $self->{captures} = {};
49111371µs my $code = $self->_generate_populate_set(@_);
# spent 371µs making 11 calls to Method::Generate::Accessor::_generate_populate_set, avg 34µs/call
492 ($code, delete $self->{captures});
493}
494
495
# spent 371µs (105+266) within Method::Generate::Accessor::_generate_populate_set which was called 11 times, avg 34µs/call: # 11 times (105µs+266µs) by Method::Generate::Accessor::generate_populate_set at line 491, avg 34µs/call
sub _generate_populate_set {
496 my ($self, $me, $name, $spec, $source, $test, $init_arg) = @_;
4971117µs if ($self->has_eager_default($name, $spec)) {
# spent 17µs making 11 calls to Method::Generate::Accessor::has_eager_default, avg 2µs/call
498 my $get_indent = ' ' x ($spec->{isa} ? 6 : 4);
49918µs my $get_default = $self->_generate_get_default(
# spent 8µs making 1 call to Method::Generate::Accessor::_generate_get_default
500 '$new', $name, $spec
501 );
502 my $get_value =
503 defined($spec->{init_arg})
504 ? "(\n${get_indent} ${test}\n"
505 ."${get_indent} ? ${source}\n${get_indent} : "
506 .$get_default
507 ."\n${get_indent})"
508 : $get_default;
509 if ($spec->{coerce}) {
510 $get_value = $self->_generate_coerce(
511 $name, $get_value,
512 $spec->{coerce}, $init_arg
513 )
514 }
515118µs ($spec->{isa}
# spent 18µs making 1 call to Method::Generate::Accessor::_generate_simple_set
516 ? " {\n my \$value = ".$get_value.";\n "
517 .$self->_generate_isa_check(
518 $name, '$value', $spec->{isa}, $init_arg
519 ).";\n"
520 .' '.$self->_generate_simple_set($me, $name, $spec, '$value').";\n"
521 ." }\n"
522 : ' '.$self->_generate_simple_set($me, $name, $spec, $get_value).";\n"
523 )
524 .($spec->{trigger}
525 ? ' '
526 .$self->_generate_trigger(
527 $name, $me, $self->_generate_simple_get($me, $name, $spec),
528 $spec->{trigger}
529 )." if ${test};\n"
530 : ''
531 );
532 } else {
53311224µs " if (${test}) {\n"
# spent 136µs making 10 calls to Method::Generate::Accessor::_generate_simple_set, avg 14µs/call # spent 88µs making 1 call to Method::Generate::Accessor::_generate_isa_check
534 .($spec->{coerce}
535 ? " $source = "
536 .$self->_generate_coerce(
537 $name, $source,
538 $spec->{coerce}, $init_arg
539 ).";\n"
540 : ""
541 )
542 .($spec->{isa}
543 ? " "
544 .$self->_generate_isa_check(
545 $name, $source, $spec->{isa}, $init_arg
546 ).";\n"
547 : ""
548 )
549 ." ".$self->_generate_simple_set($me, $name, $spec, $source).";\n"
550 .($spec->{trigger}
551 ? " "
552 .$self->_generate_trigger(
553 $name, $me, $self->_generate_simple_get($me, $name, $spec),
554 $spec->{trigger}
555 ).";\n"
556 : ""
557 )
558 ." }\n";
559 }
560}
561
562
# spent 89µs (52+37) within Method::Generate::Accessor::_generate_core_set which was called 16 times, avg 6µs/call: # 16 times (52µs+37µs) by Method::Generate::Accessor::_generate_simple_set at line 571, avg 6µs/call
sub _generate_core_set {
563 my ($self, $me, $name, $spec, $value) = @_;
5641637µs my $name_str = quotify $name;
# spent 37µs making 16 calls to Sub::Quote::quotify, avg 2µs/call
565 "${me}->{${name_str}} = ${value}";
566}
567
568
# spent 223µs (88+135) within Method::Generate::Accessor::_generate_simple_set which was called 16 times, avg 14µs/call: # 10 times (53µs+83µs) by Method::Generate::Accessor::_generate_populate_set at line 533, avg 14µs/call # 3 times (15µs+23µs) by Method::Generate::Accessor::_generate_use_default at line 302, avg 13µs/call # once (8µs+10µs) by Method::Generate::Accessor::_generate_populate_set at line 515 # once (7µs+10µs) by Method::Generate::Accessor::_generate_set at line 340 # once (5µs+9µs) by Method::Generate::Accessor::_generate_set at line 359
sub _generate_simple_set {
569 my ($self, $me, $name, $spec, $value) = @_;
5701646µs my $name_str = quotify $name;
# spent 46µs making 16 calls to Sub::Quote::quotify, avg 3µs/call
5711689µs my $simple = $self->_generate_core_set($me, $name, $spec, $value);
# spent 89µs making 16 calls to Method::Generate::Accessor::_generate_core_set, avg 6µs/call
572
573 if ($spec->{weak_ref}) {
574 require Scalar::Util;
575 my $get = $self->_generate_simple_get($me, $name, $spec);
576
577 # Perl < 5.8.3 can't weaken refs to readonly vars
578 # (e.g. string constants). This *can* be solved by:
579 #
580 # &Internals::SvREADONLY($foo, 0);
581 # Scalar::Util::weaken($foo);
582 # &Internals::SvREADONLY($foo, 1);
583 #
584 # but requires Internal functions and is just too damn crazy
585 # so simply throw a better exception
586 my $weak_simple = "do { Scalar::Util::weaken(${simple}); no warnings 'void'; $get }";
587 Moo::_Utils::lt_5_8_3() ? <<"EOC" : $weak_simple;
588 eval { Scalar::Util::weaken($simple); 1 }
589 ? do { no warnings 'void'; $get }
590 : do {
591 if( \$@ =~ /Modification of a read-only value attempted/) {
592 require Carp;
593 Carp::croak( sprintf (
594 'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3',
595 $name_str,
596 ) );
597 } else {
598 die \$@;
599 }
600 }
601EOC
602 } else {
603 $simple;
604 }
605}
606
607
# spent 173µs (10+163) within Method::Generate::Accessor::_generate_getset which was called: # once (10µs+163µs) by Method::Generate::Accessor::generate_method at line 137
sub _generate_getset {
608 my ($self, $name, $spec) = @_;
6092163µs q{(@_ > 1}."\n ? ".$self->_generate_set($name, $spec)
# spent 132µs making 1 call to Method::Generate::Accessor::_generate_get # spent 30µs making 1 call to Method::Generate::Accessor::_generate_set
610 ."\n : ".$self->_generate_get($name, $spec)."\n )";
611}
612
613sub _generate_asserter {
614 my ($self, $name, $spec) = @_;
615
616 "do {\n"
617 ." my \$val = ".$self->_generate_get($name, $spec).";\n"
618 ." unless (".$self->_generate_simple_has('$_[0]', $name, $spec).") {\n"
619 .qq! die "Attempted to access '${name}' but it is not set";\n!
620 ." }\n"
621 ." \$val;\n"
622 ."}\n";
623}
624sub _generate_delegation {
625 my ($self, $asserter, $target, $args) = @_;
626 my $arg_string = do {
627 if (@$args) {
628 # I could, I reckon, linearise out non-refs here using quotify
629 # plus something to check for numbers but I'm unsure if it's worth it
630 $self->{captures}{'@curries'} = $args;
631 '@curries, @_';
632 } else {
633 '@_';
634 }
635 };
636 "shift->${asserter}->${target}(${arg_string});";
637}
638
639
# spent 3.95ms (45µs+3.90) within Method::Generate::Accessor::_generate_xs which was called 4 times, avg 987µs/call: # 4 times (45µs+3.90ms) by Method::Generate::Accessor::generate_method at line 110, avg 987µs/call
sub _generate_xs {
640 my ($self, $type, $into, $name, $slot) = @_;
64143.89ms Class::XSAccessor->import(
# spent 3.89ms making 4 calls to Class::XSAccessor::import, avg 974µs/call
642 class => $into,
643 $type => { $name => $slot },
644 replace => 1,
645 );
64649µs $into->can($name);
# spent 9µs making 4 calls to UNIVERSAL::can, avg 2µs/call
647}
648
649
# spent 2µs within Method::Generate::Accessor::default_construction_string which was called: # once (2µs+0s) by Method::Generate::Constructor::_build_construction_string at line 68 of Method/Generate/Constructor.pm
sub default_construction_string { '{}' }
650
651
# spent 31µs (25+7) within Method::Generate::Accessor::_validate_codulatable which was called 3 times, avg 10µs/call: # 2 times (14µs+3µs) by Method::Generate::Accessor::generate_method at line 89, avg 8µs/call # once (11µs+4µs) by Method::Generate::Accessor::generate_method at line 86
sub _validate_codulatable {
652 my ($self, $setting, $value, $into, $appended) = @_;
65337µs my $invalid = "Invalid $setting '" . overload::StrVal($value)
# spent 7µs making 3 calls to overload::AddrRef, avg 2µs/call
654 . "' for $into not a coderef";
655 $invalid .= " $appended" if $appended;
656
657 unless (ref $value and (ref $value eq 'CODE' or blessed($value))) {
658 die "$invalid or code-convertible object";
659 }
660
661 unless (eval { \&$value }) {
662 die "$invalid and could not be converted to a coderef: $@";
663 }
664
665 1;
666}
667
6681;
 
# spent 2µs within Method::Generate::Accessor::CORE:qr which was called: # once (2µs+0s) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 25
sub Method::Generate::Accessor::CORE:qr; # opcode
# spent 17µs within Method::Generate::Accessor::CORE:regcomp which was called: # once (17µs+0s) by DBIx::Class::Storage::BlockRunner::BEGIN@16 at line 25
sub Method::Generate::Accessor::CORE:regcomp; # opcode
# spent 2µs within Method::Generate::Accessor::CORE:subst which was called 7 times, avg 329ns/call: # 7 times (2µs+0s) by Method::Generate::Accessor::generate_method at line 36, avg 329ns/call
sub Method::Generate::Accessor::CORE:subst; # opcode