Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Method/Generate/Accessor.pm |
Statements | Executed 5206 statements in 13.6ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 4.73ms | 7.98ms | BEGIN@8 | Method::Generate::Accessor::
49 | 1 | 1 | 2.58ms | 85.8ms | generate_method | Method::Generate::Accessor::
55 | 1 | 1 | 1.14ms | 16.1ms | _generate_populate_set | Method::Generate::Accessor::
86 | 3 | 1 | 638µs | 15.0ms | _validate_codulatable | Method::Generate::Accessor::
82 | 3 | 1 | 587µs | 1.70ms | _generate_simple_set | Method::Generate::Accessor::
51 | 3 | 1 | 475µs | 20.7ms | _generate_get | Method::Generate::Accessor::
34 | 2 | 1 | 380µs | 997µs | _generate_call_code | Method::Generate::Accessor::
82 | 1 | 1 | 348µs | 645µs | _generate_core_set | Method::Generate::Accessor::
17 | 1 | 1 | 346µs | 19.4ms | _generate_use_default | Method::Generate::Accessor::
82 | 4 | 1 | 343µs | 831µs | _generate_simple_get | Method::Generate::Accessor::
17 | 1 | 1 | 255µs | 685µs | _wrap_attr_exception | Method::Generate::Accessor::
10 | 2 | 1 | 238µs | 3.02ms | _generate_set | Method::Generate::Accessor::
55 | 1 | 1 | 219µs | 16.4ms | generate_populate_set | Method::Generate::Accessor::
14 | 1 | 1 | 181µs | 18.6ms | _generate_asserter | Method::Generate::Accessor::
41 | 1 | 1 | 160µs | 160µs | _generate_delegation | Method::Generate::Accessor::
31 | 2 | 1 | 143µs | 285µs | _generate_simple_has | Method::Generate::Accessor::
24 | 2 | 1 | 137µs | 696µs | _generate_get_default | Method::Generate::Accessor::
17 | 1 | 1 | 130µs | 1.31ms | _generate_coerce | Method::Generate::Accessor::
61 | 2 | 2 | 115µs | 115µs | has_eager_default | Method::Generate::Accessor::
51 | 1 | 1 | 94µs | 94µs | is_simple_get | Method::Generate::Accessor::
17 | 1 | 1 | 72µs | 154µs | _attr_desc | Method::Generate::Accessor::
10 | 1 | 1 | 63µs | 84µs | is_simple_set | Method::Generate::Accessor::
13 | 1 | 1 | 40µs | 40µs | has_default | Method::Generate::Accessor::
2 | 1 | 1 | 31µs | 31µs | merge_specs | Method::Generate::Accessor::
1 | 1 | 1 | 26µs | 29µs | BEGIN@2 | Method::Generate::Accessor::
49 | 1 | 1 | 25µs | 25µs | CORE:subst (opcode) | Method::Generate::Accessor::
3 | 1 | 1 | 25µs | 823µs | _generate_getset | Method::Generate::Accessor::
1 | 1 | 1 | 15µs | 46µs | BEGIN@685 | Method::Generate::Accessor::
6 | 1 | 1 | 15µs | 15µs | default_construction_string | Method::Generate::Accessor::
1 | 1 | 1 | 12µs | 12µs | BEGIN@7 | Method::Generate::Accessor::
1 | 1 | 1 | 11µs | 319µs | BEGIN@18 | Method::Generate::Accessor::
1 | 1 | 1 | 10µs | 27µs | BEGIN@9 | Method::Generate::Accessor::
1 | 1 | 1 | 8µs | 28µs | BEGIN@10 | Method::Generate::Accessor::
1 | 1 | 1 | 5µs | 33µs | BEGIN@3 | Method::Generate::Accessor::
1 | 1 | 1 | 5µs | 33µs | BEGIN@5 | Method::Generate::Accessor::
1 | 1 | 1 | 4µs | 4µs | BEGIN@11 | Method::Generate::Accessor::
1 | 1 | 1 | 4µs | 4µs | BEGIN@34 | Method::Generate::Accessor::
1 | 1 | 1 | 2µs | 2µs | BEGIN@6 | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | __ANON__[:95] | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _die_overwrite | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _generate_isa_check | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _generate_simple_clear | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _generate_trigger | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _generate_xs | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | _sanitize_name | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_coerce | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_get_default | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_isa_check | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_simple_get | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_simple_has | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_trigger | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | generate_use_default | Method::Generate::Accessor::
0 | 0 | 0 | 0s | 0s | is_simple_attribute | Method::Generate::Accessor::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Method::Generate::Accessor; | ||||
2 | 2 | 28µs | 2 | 32µs | # spent 29µs (26+3) within Method::Generate::Accessor::BEGIN@2 which was called:
# once (26µs+3µs) by Moo::_accessor_maker_for at line 2 # spent 29µs making 1 call to Method::Generate::Accessor::BEGIN@2
# spent 3µs making 1 call to strict::import |
3 | 2 | 20µs | 2 | 61µs | # spent 33µs (5+28) within Method::Generate::Accessor::BEGIN@3 which was called:
# once (5µs+28µs) by Moo::_accessor_maker_for at line 3 # spent 33µs making 1 call to Method::Generate::Accessor::BEGIN@3
# spent 28µs making 1 call to warnings::import |
4 | |||||
5 | 2 | 15µs | 2 | 61µs | # spent 33µs (5+28) within Method::Generate::Accessor::BEGIN@5 which was called:
# once (5µs+28µs) by Moo::_accessor_maker_for at line 5 # spent 33µs making 1 call to Method::Generate::Accessor::BEGIN@5
# spent 28µs making 1 call to Exporter::import |
6 | 2 | 27µs | 1 | 2µs | # spent 2µs within Method::Generate::Accessor::BEGIN@6 which was called:
# once (2µs+0s) by Moo::_accessor_maker_for at line 6 # spent 2µs making 1 call to Method::Generate::Accessor::BEGIN@6 |
7 | 1 | 29µs | 1 | 12µs | # spent 12µs within Method::Generate::Accessor::BEGIN@7 which was called:
# once (12µs+0s) by Moo::_accessor_maker_for at line 7 # spent 12µs making 1 call to Method::Generate::Accessor::BEGIN@7 |
8 | 2 | 806µs | 2 | 8.06ms | # spent 7.98ms (4.73+3.25) within Method::Generate::Accessor::BEGIN@8 which was called:
# once (4.73ms+3.25ms) by Moo::_accessor_maker_for at line 8 # spent 7.98ms making 1 call to Method::Generate::Accessor::BEGIN@8
# spent 78µs making 1 call to Exporter::import |
9 | 2 | 30µs | 2 | 44µs | # spent 27µs (10+17) within Method::Generate::Accessor::BEGIN@9 which was called:
# once (10µs+17µs) by Moo::_accessor_maker_for at line 9 # spent 27µs making 1 call to Method::Generate::Accessor::BEGIN@9
# spent 17µs making 1 call to Exporter::import |
10 | 2 | 37µs | 2 | 48µs | # spent 28µs (8+20) within Method::Generate::Accessor::BEGIN@10 which was called:
# once (8µs+20µs) by Moo::_accessor_maker_for at line 10 # spent 28µs making 1 call to Method::Generate::Accessor::BEGIN@10
# spent 20µs making 1 call to Exporter::import |
11 | # spent 4µs within Method::Generate::Accessor::BEGIN@11 which was called:
# once (4µs+0s) by Moo::_accessor_maker_for at line 17 | ||||
12 | 1 | 9µs | our @CARP_NOT = qw( | ||
13 | Moo::_Utils | ||||
14 | Moo::Object | ||||
15 | Moo::Role | ||||
16 | ); | ||||
17 | 1 | 114µs | 1 | 4µs | } # spent 4µs making 1 call to Method::Generate::Accessor::BEGIN@11 |
18 | # spent 319µs (11+308) within Method::Generate::Accessor::BEGIN@18 which was called:
# once (11µs+308µs) by Moo::_accessor_maker_for at line 33 | ||||
19 | *_CAN_WEAKEN_READONLY = ( | ||||
20 | "$]" < 5.008_003 or $ENV{MOO_TEST_PRE_583} | ||||
21 | 1 | 4µs | ) ? sub(){0} : sub(){1}; | ||
22 | our $CAN_HAZ_XS = | ||||
23 | !$ENV{MOO_XS_DISABLE} | ||||
24 | && | ||||
25 | _maybe_load_module('Class::XSAccessor') | ||||
26 | && | ||||
27 | 1 | 3µs | 1 | 308µs | (eval { Class::XSAccessor->VERSION('1.07') }) # spent 308µs making 1 call to Moo::_Utils::_maybe_load_module |
28 | ; | ||||
29 | our $CAN_HAZ_XS_PRED = | ||||
30 | $CAN_HAZ_XS && | ||||
31 | 1 | 4µs | (eval { Class::XSAccessor->VERSION('1.17') }) | ||
32 | ; | ||||
33 | 1 | 56µs | 1 | 319µs | } # spent 319µs making 1 call to Method::Generate::Accessor::BEGIN@18 |
34 | # spent 4µs within Method::Generate::Accessor::BEGIN@34 which was called:
# once (4µs+0s) by Moo::_accessor_maker_for at line 38 | ||||
35 | package | ||||
36 | Method::Generate::Accessor::_Generated; | ||||
37 | 1 | 4µs | $Carp::Internal{+__PACKAGE__} = 1; | ||
38 | 1 | 4.03ms | 1 | 4µs | } # spent 4µs making 1 call to Method::Generate::Accessor::BEGIN@34 |
39 | |||||
40 | sub _die_overwrite { | ||||
41 | my ($pkg, $method, $type) = @_; | ||||
42 | croak "You cannot overwrite a locally defined method ($method) with " | ||||
43 | . ( $type || 'an accessor' ); | ||||
44 | } | ||||
45 | |||||
46 | # spent 85.8ms (2.58+83.2) within Method::Generate::Accessor::generate_method which was called 49 times, avg 1.75ms/call:
# 49 times (2.58ms+83.2ms) by Moo::has at line 121 of Moo.pm, avg 1.75ms/call | ||||
47 | 49 | 30µs | my ($self, $into, $name, $spec, $quote_opts) = @_; | ||
48 | $quote_opts = { | ||||
49 | no_defer => 1, | ||||
50 | package => 'Method::Generate::Accessor::_Generated', | ||||
51 | 49 | 130µs | %{ $quote_opts||{} }, | ||
52 | }; | ||||
53 | 49 | 113µs | 49 | 25µs | $spec->{allow_overwrite}++ if $name =~ s/^\+//; # spent 25µs making 49 calls to Method::Generate::Accessor::CORE:subst, avg 510ns/call |
54 | 49 | 30µs | croak "Must have an is" unless my $is = $spec->{is}; | ||
55 | 49 | 63µs | if ($is eq 'ro') { | ||
56 | $spec->{reader} = $name unless exists $spec->{reader}; | ||||
57 | } elsif ($is eq 'rw') { | ||||
58 | $spec->{accessor} = $name unless exists $spec->{accessor} | ||||
59 | or ( $spec->{reader} and $spec->{writer} ); | ||||
60 | } elsif ($is eq 'lazy') { | ||||
61 | $spec->{reader} = $name unless exists $spec->{reader}; | ||||
62 | $spec->{lazy} = 1; | ||||
63 | $spec->{builder} ||= '_build_'.$name unless exists $spec->{default}; | ||||
64 | } elsif ($is eq 'rwp') { | ||||
65 | 6 | 2µs | $spec->{reader} = $name unless exists $spec->{reader}; | ||
66 | 6 | 7µs | $spec->{writer} = "_set_${name}" unless exists $spec->{writer}; | ||
67 | } elsif ($is ne 'bare') { | ||||
68 | croak "Unknown is ${is}"; | ||||
69 | } | ||||
70 | 49 | 12µs | if (exists $spec->{builder}) { | ||
71 | if(ref $spec->{builder}) { | ||||
72 | $self->_validate_codulatable('builder', $spec->{builder}, | ||||
73 | "$into->$name", 'or a method name'); | ||||
74 | $spec->{builder_sub} = $spec->{builder}; | ||||
75 | $spec->{builder} = 1; | ||||
76 | } | ||||
77 | $spec->{builder} = '_build_'.$name if ($spec->{builder}||0) eq 1; | ||||
78 | croak "Invalid builder for $into->$name - not a valid method name" | ||||
79 | if $spec->{builder} !~ _module_name_rx; | ||||
80 | } | ||||
81 | 49 | 27µs | if (($spec->{predicate}||0) eq 1) { | ||
82 | $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}"; | ||||
83 | } | ||||
84 | 49 | 28µs | if (($spec->{clearer}||0) eq 1) { | ||
85 | $spec->{clearer} = $name =~ /^_/ ? "_clear${name}" : "clear_${name}"; | ||||
86 | } | ||||
87 | 49 | 17µs | if (($spec->{trigger}||0) eq 1) { | ||
88 | $spec->{trigger} = quote_sub('shift->_trigger_'.$name.'(@_)'); | ||||
89 | } | ||||
90 | 49 | 22µs | if (($spec->{coerce}||0) eq 1) { | ||
91 | my $isa = $spec->{isa}; | ||||
92 | if (blessed $isa and $isa->can('coercion')) { | ||||
93 | $spec->{coerce} = $isa->coercion; | ||||
94 | } elsif (blessed $isa and $isa->can('coerce')) { | ||||
95 | $spec->{coerce} = sub { $isa->coerce(@_) }; | ||||
96 | } else { | ||||
97 | croak "Invalid coercion for $into->$name - no appropriate type constraint"; | ||||
98 | } | ||||
99 | } | ||||
100 | |||||
101 | 49 | 49µs | foreach my $setting (qw( isa coerce )) { | ||
102 | 98 | 45µs | next if !exists $spec->{$setting}; | ||
103 | 57 | 163µs | 57 | 14.9ms | $self->_validate_codulatable($setting, $spec->{$setting}, "$into->$name"); # spent 14.9ms making 57 calls to Method::Generate::Accessor::_validate_codulatable, avg 262µs/call |
104 | } | ||||
105 | |||||
106 | 49 | 67µs | 17 | 82µs | if (exists $spec->{default}) { # spent 82µs making 17 calls to Method::Generate::Accessor::_validate_codulatable, avg 5µs/call |
107 | if (ref $spec->{default}) { | ||||
108 | $self->_validate_codulatable('default', $spec->{default}, "$into->$name", | ||||
109 | 'or a non-ref'); | ||||
110 | } | ||||
111 | } | ||||
112 | |||||
113 | 49 | 21µs | if (exists $spec->{moosify}) { | ||
114 | 12 | 20µs | if (ref $spec->{moosify} ne 'ARRAY') { | ||
115 | $spec->{moosify} = [$spec->{moosify}]; | ||||
116 | } | ||||
117 | |||||
118 | 12 | 15µs | foreach my $spec (@{$spec->{moosify}}) { | ||
119 | 12 | 19µs | 12 | 33µs | $self->_validate_codulatable('moosify', $spec, "$into->$name"); # spent 33µs making 12 calls to Method::Generate::Accessor::_validate_codulatable, avg 3µs/call |
120 | } | ||||
121 | } | ||||
122 | |||||
123 | 49 | 10µs | my %methods; | ||
124 | 49 | 60µs | if (my $reader = $spec->{reader}) { | ||
125 | _die_overwrite($into, $reader, 'a reader') | ||||
126 | 34 | 105µs | if !$spec->{allow_overwrite} && defined &{"${into}::${reader}"}; | ||
127 | 34 | 26µs | if (our $CAN_HAZ_XS && $self->is_simple_get($name, $spec)) { | ||
128 | $methods{$reader} = $self->_generate_xs( | ||||
129 | getters => $into, $reader, $name, $spec | ||||
130 | ); | ||||
131 | } else { | ||||
132 | 34 | 21µs | $self->{captures} = {}; | ||
133 | $methods{$reader} = | ||||
134 | quote_sub "${into}::${reader}" | ||||
135 | => ' Carp::croak("'.$reader.' is a read-only accessor") if @_ > 1;'."\n" | ||||
136 | .$self->_generate_get($name, $spec) | ||||
137 | => delete $self->{captures} | ||||
138 | 34 | 165µs | 68 | 16.7ms | => $quote_opts # spent 14.3ms making 34 calls to Sub::Quote::quote_sub, avg 420µs/call
# spent 2.45ms making 34 calls to Method::Generate::Accessor::_generate_get, avg 72µs/call |
139 | ; | ||||
140 | } | ||||
141 | } | ||||
142 | 49 | 24µs | if (my $accessor = $spec->{accessor}) { | ||
143 | _die_overwrite($into, $accessor, 'an accessor') | ||||
144 | 3 | 13µs | if !$spec->{allow_overwrite} && defined &{"${into}::${accessor}"}; | ||
145 | 3 | 4µs | if ( | ||
146 | our $CAN_HAZ_XS | ||||
147 | && $self->is_simple_get($name, $spec) | ||||
148 | && $self->is_simple_set($name, $spec) | ||||
149 | ) { | ||||
150 | $methods{$accessor} = $self->_generate_xs( | ||||
151 | accessors => $into, $accessor, $name, $spec | ||||
152 | ); | ||||
153 | } else { | ||||
154 | 3 | 2µs | $self->{captures} = {}; | ||
155 | $methods{$accessor} = | ||||
156 | quote_sub "${into}::${accessor}" | ||||
157 | => $self->_generate_getset($name, $spec) | ||||
158 | => delete $self->{captures} | ||||
159 | 3 | 19µs | 6 | 2.54ms | => $quote_opts # spent 1.72ms making 3 calls to Sub::Quote::quote_sub, avg 573µs/call
# spent 823µs making 3 calls to Method::Generate::Accessor::_generate_getset, avg 274µs/call |
160 | ; | ||||
161 | } | ||||
162 | } | ||||
163 | 49 | 27µs | if (my $writer = $spec->{writer}) { | ||
164 | _die_overwrite($into, $writer, 'a writer') | ||||
165 | 7 | 17µs | if !$spec->{allow_overwrite} && defined &{"${into}::${writer}"}; | ||
166 | 7 | 6µs | if ( | ||
167 | our $CAN_HAZ_XS | ||||
168 | && $self->is_simple_set($name, $spec) | ||||
169 | ) { | ||||
170 | $methods{$writer} = $self->_generate_xs( | ||||
171 | setters => $into, $writer, $name, $spec | ||||
172 | ); | ||||
173 | } else { | ||||
174 | 7 | 5µs | $self->{captures} = {}; | ||
175 | $methods{$writer} = | ||||
176 | quote_sub "${into}::${writer}" | ||||
177 | => $self->_generate_set($name, $spec) | ||||
178 | => delete $self->{captures} | ||||
179 | 7 | 34µs | 14 | 6.00ms | => $quote_opts # spent 3.73ms making 7 calls to Sub::Quote::quote_sub, avg 532µs/call
# spent 2.27ms making 7 calls to Method::Generate::Accessor::_generate_set, avg 324µs/call |
180 | ; | ||||
181 | } | ||||
182 | } | ||||
183 | 49 | 20µs | if (my $pred = $spec->{predicate}) { | ||
184 | _die_overwrite($into, $pred, 'a predicate') | ||||
185 | if !$spec->{allow_overwrite} && defined &{"${into}::${pred}"}; | ||||
186 | if (our $CAN_HAZ_XS && our $CAN_HAZ_XS_PRED) { | ||||
187 | $methods{$pred} = $self->_generate_xs( | ||||
188 | exists_predicates => $into, $pred, $name, $spec | ||||
189 | ); | ||||
190 | } else { | ||||
191 | $self->{captures} = {}; | ||||
192 | $methods{$pred} = | ||||
193 | quote_sub "${into}::${pred}" | ||||
194 | => $self->_generate_simple_has('$_[0]', $name, $spec)."\n" | ||||
195 | => delete $self->{captures} | ||||
196 | => $quote_opts | ||||
197 | ; | ||||
198 | } | ||||
199 | } | ||||
200 | 49 | 27µs | if (my $builder = delete $spec->{builder_sub}) { | ||
201 | _install_coderef( "${into}::$spec->{builder}" => $builder ); | ||||
202 | } | ||||
203 | 49 | 19µs | if (my $cl = $spec->{clearer}) { | ||
204 | _die_overwrite($into, $cl, 'a clearer') | ||||
205 | if !$spec->{allow_overwrite} && defined &{"${into}::${cl}"}; | ||||
206 | $self->{captures} = {}; | ||||
207 | $methods{$cl} = | ||||
208 | quote_sub "${into}::${cl}" | ||||
209 | => $self->_generate_simple_clear('$_[0]', $name, $spec)."\n" | ||||
210 | => delete $self->{captures} | ||||
211 | => $quote_opts | ||||
212 | ; | ||||
213 | } | ||||
214 | 49 | 34µs | if (my $hspec = $spec->{handles}) { | ||
215 | 14 | 25µs | my $asserter = $spec->{asserter} ||= '_assert_'.$name; | ||
216 | 14 | 8µs | my @specs = do { | ||
217 | 14 | 60µs | if (ref($hspec) eq 'ARRAY') { | ||
218 | map [ $_ => $_ ], @$hspec; | ||||
219 | } elsif (ref($hspec) eq 'HASH') { | ||||
220 | map [ $_ => ref($hspec->{$_}) ? @{$hspec->{$_}} : $hspec->{$_} ], | ||||
221 | keys %$hspec; | ||||
222 | } elsif (!ref($hspec)) { | ||||
223 | require Moo::Role; | ||||
224 | map [ $_ => $_ ], Moo::Role->methods_provided_by($hspec) | ||||
225 | } else { | ||||
226 | croak "You gave me a handles of ${hspec} and I have no idea why"; | ||||
227 | } | ||||
228 | }; | ||||
229 | 14 | 33µs | foreach my $delegation_spec (@specs) { | ||
230 | 41 | 24µs | my ($proxy, $target, @args) = @$delegation_spec; | ||
231 | _die_overwrite($into, $proxy, 'a delegation') | ||||
232 | 41 | 127µs | if !$spec->{allow_overwrite} && defined &{"${into}::${proxy}"}; | ||
233 | 41 | 31µs | $self->{captures} = {}; | ||
234 | $methods{$proxy} = | ||||
235 | quote_sub "${into}::${proxy}" | ||||
236 | => $self->_generate_delegation($asserter, $target, \@args) | ||||
237 | => delete $self->{captures} | ||||
238 | 41 | 244µs | 82 | 14.7ms | => $quote_opts # spent 14.5ms making 41 calls to Sub::Quote::quote_sub, avg 355µs/call
# spent 160µs making 41 calls to Method::Generate::Accessor::_generate_delegation, avg 4µs/call |
239 | ; | ||||
240 | } | ||||
241 | } | ||||
242 | 49 | 30µs | if (my $asserter = $spec->{asserter}) { | ||
243 | _die_overwrite($into, $asserter, 'an asserter') | ||||
244 | 14 | 58µs | if !$spec->{allow_overwrite} && defined &{"${into}::${asserter}"}; | ||
245 | 14 | 15µs | local $self->{captures} = {}; | ||
246 | $methods{$asserter} = | ||||
247 | quote_sub "${into}::${asserter}" | ||||
248 | => $self->_generate_asserter($name, $spec) | ||||
249 | => delete $self->{captures} | ||||
250 | 14 | 87µs | 28 | 28.2ms | => $quote_opts # spent 18.6ms making 14 calls to Method::Generate::Accessor::_generate_asserter, avg 1.33ms/call
# spent 9.58ms making 14 calls to Sub::Quote::quote_sub, avg 684µs/call |
251 | ; | ||||
252 | } | ||||
253 | 49 | 190µs | \%methods; | ||
254 | } | ||||
255 | |||||
256 | # spent 31µs within Method::Generate::Accessor::merge_specs which was called 2 times, avg 16µs/call:
# 2 times (31µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 27 of Method/Generate/Constructor.pm, avg 16µs/call | ||||
257 | 2 | 2µs | my ($self, @specs) = @_; | ||
258 | 2 | 2µs | my $spec = shift @specs; | ||
259 | 2 | 2µs | for my $old_spec (@specs) { | ||
260 | 2 | 5µs | foreach my $key (keys %$old_spec) { | ||
261 | 12 | 16µs | if ($key eq 'handles') { | ||
262 | } | ||||
263 | elsif ($key eq 'moosify') { | ||||
264 | $spec->{$key} = [ | ||||
265 | map { ref $_ eq 'ARRAY' ? @$_ : $_ } | ||||
266 | grep defined, | ||||
267 | ($old_spec->{$key}, $spec->{$key}) | ||||
268 | ]; | ||||
269 | } | ||||
270 | elsif ($key eq 'builder' || $key eq 'default') { | ||||
271 | $spec->{$key} = $old_spec->{$key} | ||||
272 | if !(exists $spec->{builder} || exists $spec->{default}); | ||||
273 | } | ||||
274 | elsif (!exists $spec->{$key}) { | ||||
275 | $spec->{$key} = $old_spec->{$key}; | ||||
276 | } | ||||
277 | } | ||||
278 | } | ||||
279 | 2 | 12µs | $spec; | ||
280 | } | ||||
281 | |||||
282 | sub is_simple_attribute { | ||||
283 | my ($self, $name, $spec) = @_; | ||||
284 | # clearer doesn't have to be listed because it doesn't | ||||
285 | # affect whether defined/exists makes a difference | ||||
286 | !grep $spec->{$_}, | ||||
287 | qw(lazy default builder coerce isa trigger predicate weak_ref); | ||||
288 | } | ||||
289 | |||||
290 | # spent 94µs within Method::Generate::Accessor::is_simple_get which was called 51 times, avg 2µs/call:
# 51 times (94µs+0s) by Method::Generate::Accessor::_generate_get at line 313, avg 2µs/call | ||||
291 | 51 | 19µs | my ($self, $name, $spec) = @_; | ||
292 | 51 | 106µs | !($spec->{lazy} and (exists $spec->{default} or $spec->{builder})); | ||
293 | } | ||||
294 | |||||
295 | # spent 84µs (63+21) within Method::Generate::Accessor::is_simple_set which was called 10 times, avg 8µs/call:
# 10 times (63µs+21µs) by Method::Generate::Accessor::_generate_set at line 402, avg 8µs/call | ||||
296 | 10 | 4µs | my ($self, $name, $spec) = @_; | ||
297 | 10 | 57µs | 10 | 21µs | !grep $spec->{$_}, qw(coerce isa trigger weak_ref); # spent 21µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 2µs/call |
298 | } | ||||
299 | |||||
300 | # spent 40µs within Method::Generate::Accessor::has_default which was called 13 times, avg 3µs/call:
# 13 times (40µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 29 of Method/Generate/Constructor.pm, avg 3µs/call | ||||
301 | 13 | 6µs | my ($self, $name, $spec) = @_; | ||
302 | 13 | 41µs | $spec->{builder} or exists $spec->{default} or (($spec->{is}||'') eq 'lazy'); | ||
303 | } | ||||
304 | |||||
305 | # spent 115µs within Method::Generate::Accessor::has_eager_default which was called 61 times, avg 2µs/call:
# 55 times (99µs+0s) by Method::Generate::Accessor::_generate_populate_set at line 547, avg 2µs/call
# 6 times (16µs+0s) by Method::Generate::Constructor::_assign_new at line 214 of Method/Generate/Constructor.pm, avg 3µs/call | ||||
306 | 61 | 23µs | my ($self, $name, $spec) = @_; | ||
307 | 61 | 145µs | (!$spec->{lazy} and (exists $spec->{default} or $spec->{builder})); | ||
308 | } | ||||
309 | |||||
310 | # spent 20.7ms (475µs+20.2) within Method::Generate::Accessor::_generate_get which was called 51 times, avg 406µs/call:
# 34 times (290µs+2.16ms) by Method::Generate::Accessor::generate_method at line 138, avg 72µs/call
# 14 times (166µs+18.0ms) by Method::Generate::Accessor::_generate_asserter at line 644, avg 1.30ms/call
# 3 times (19µs+30µs) by Method::Generate::Accessor::_generate_getset at line 637, avg 16µs/call | ||||
311 | 51 | 19µs | my ($self, $name, $spec) = @_; | ||
312 | 51 | 86µs | 51 | 578µs | my $simple = $self->_generate_simple_get('$_[0]', $name, $spec); # spent 578µs making 51 calls to Method::Generate::Accessor::_generate_simple_get, avg 11µs/call |
313 | 51 | 205µs | 51 | 94µs | if ($self->is_simple_get($name, $spec)) { # spent 94µs making 51 calls to Method::Generate::Accessor::is_simple_get, avg 2µs/call |
314 | $simple; | ||||
315 | } else { | ||||
316 | 17 | 73µs | 34 | 19.5ms | $self->_generate_use_default( # spent 19.4ms making 17 calls to Method::Generate::Accessor::_generate_use_default, avg 1.14ms/call
# spent 160µs making 17 calls to Method::Generate::Accessor::_generate_simple_has, avg 9µs/call |
317 | '$_[0]', $name, $spec, | ||||
318 | $self->_generate_simple_has('$_[0]', $name, $spec), | ||||
319 | ); | ||||
320 | } | ||||
321 | } | ||||
322 | |||||
323 | sub generate_simple_has { | ||||
324 | my $self = shift; | ||||
325 | $self->{captures} = {}; | ||||
326 | my $code = $self->_generate_simple_has(@_); | ||||
327 | ($code, delete $self->{captures}); | ||||
328 | } | ||||
329 | |||||
330 | # spent 285µs (143+142) within Method::Generate::Accessor::_generate_simple_has which was called 31 times, avg 9µs/call:
# 17 times (79µs+81µs) by Method::Generate::Accessor::_generate_get at line 316, avg 9µs/call
# 14 times (64µs+61µs) by Method::Generate::Accessor::_generate_asserter at line 644, avg 9µs/call | ||||
331 | 31 | 21µs | my ($self, $me, $name) = @_; | ||
332 | 31 | 124µs | 31 | 142µs | "exists ${me}->{${\quotify $name}}"; # spent 142µs making 31 calls to Sub::Quote::quotify, avg 5µs/call |
333 | } | ||||
334 | |||||
335 | sub _generate_simple_clear { | ||||
336 | my ($self, $me, $name) = @_; | ||||
337 | " delete ${me}->{${\quotify $name}}\n" | ||||
338 | } | ||||
339 | |||||
340 | sub generate_get_default { | ||||
341 | my $self = shift; | ||||
342 | $self->{captures} = {}; | ||||
343 | my $code = $self->_generate_get_default(@_); | ||||
344 | ($code, delete $self->{captures}); | ||||
345 | } | ||||
346 | |||||
347 | sub generate_use_default { | ||||
348 | my $self = shift; | ||||
349 | $self->{captures} = {}; | ||||
350 | my $code = $self->_generate_use_default(@_); | ||||
351 | ($code, delete $self->{captures}); | ||||
352 | } | ||||
353 | |||||
354 | # spent 19.4ms (346µs+19.0) within Method::Generate::Accessor::_generate_use_default which was called 17 times, avg 1.14ms/call:
# 17 times (346µs+19.0ms) by Method::Generate::Accessor::_generate_get at line 316, avg 1.14ms/call | ||||
355 | 17 | 14µs | my ($self, $me, $name, $spec, $test) = @_; | ||
356 | 17 | 32µs | 17 | 597µs | my $get_value = $self->_generate_get_default($me, $name, $spec); # spent 597µs making 17 calls to Method::Generate::Accessor::_generate_get_default, avg 35µs/call |
357 | 17 | 19µs | 2 | 202µs | if ($spec->{coerce}) { # spent 202µs making 2 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 101µs/call |
358 | $get_value = $self->_generate_coerce( | ||||
359 | $name, $get_value, | ||||
360 | $spec->{coerce} | ||||
361 | ) | ||||
362 | } | ||||
363 | $test." ? \n" | ||||
364 | .$self->_generate_simple_get($me, $name, $spec)."\n:" | ||||
365 | .($spec->{isa} ? | ||||
366 | " do {\n my \$value = ".$get_value.";\n" | ||||
367 | 17 | 225µs | 68 | 18.2ms | ." ".$self->_generate_isa_check($name, '$value', $spec->{isa}).";\n" # spent 17.6ms making 17 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 1.04ms/call
# spent 423µs making 17 calls to Method::Generate::Accessor::_generate_simple_set, avg 25µs/call
# spent 144µs making 17 calls to Method::Generate::Accessor::_generate_simple_get, avg 8µs/call
# spent 32µs making 17 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 2µs/call |
368 | ." ".$self->_generate_simple_set($me, $name, $spec, '$value')."\n" | ||||
369 | ." }\n" | ||||
370 | : ' ('.$self->_generate_simple_set($me, $name, $spec, $get_value).")\n" | ||||
371 | ); | ||||
372 | } | ||||
373 | |||||
374 | # spent 696µs (137+559) within Method::Generate::Accessor::_generate_get_default which was called 24 times, avg 29µs/call:
# 17 times (92µs+505µs) by Method::Generate::Accessor::_generate_use_default at line 356, avg 35µs/call
# 7 times (45µs+54µs) by Method::Generate::Accessor::_generate_populate_set at line 552, avg 14µs/call | ||||
375 | 24 | 14µs | my ($self, $me, $name, $spec) = @_; | ||
376 | 24 | 106µs | 24 | 559µs | if (exists $spec->{default}) { # spent 505µs making 17 calls to Method::Generate::Accessor::_generate_call_code, avg 30µs/call
# spent 54µs making 7 calls to Sub::Quote::quotify, avg 8µs/call |
377 | ref $spec->{default} | ||||
378 | ? $self->_generate_call_code($name, 'default', $me, $spec->{default}) | ||||
379 | : quotify $spec->{default}; | ||||
380 | } | ||||
381 | else { | ||||
382 | "${me}->${\$spec->{builder}}" | ||||
383 | } | ||||
384 | } | ||||
385 | |||||
386 | sub generate_simple_get { | ||||
387 | my ($self, @args) = @_; | ||||
388 | $self->{captures} = {}; | ||||
389 | my $code = $self->_generate_simple_get(@args); | ||||
390 | ($code, delete $self->{captures}); | ||||
391 | } | ||||
392 | |||||
393 | # spent 831µs (343+488) within Method::Generate::Accessor::_generate_simple_get which was called 82 times, avg 10µs/call:
# 51 times (233µs+345µs) by Method::Generate::Accessor::_generate_get at line 312, avg 11µs/call
# 17 times (55µs+89µs) by Method::Generate::Accessor::_generate_use_default at line 367, avg 8µs/call
# 10 times (40µs+41µs) by Method::Generate::Accessor::_generate_set at line 410, avg 8µs/call
# 4 times (15µs+13µs) by Method::Generate::Accessor::_generate_simple_set at line 601, avg 7µs/call | ||||
394 | 82 | 34µs | my ($self, $me, $name) = @_; | ||
395 | 82 | 100µs | 82 | 488µs | my $name_str = quotify $name; # spent 488µs making 82 calls to Sub::Quote::quotify, avg 6µs/call |
396 | 82 | 250µs | "${me}->{${name_str}}"; | ||
397 | } | ||||
398 | |||||
399 | # spent 3.02ms (238µs+2.78) within Method::Generate::Accessor::_generate_set which was called 10 times, avg 302µs/call:
# 7 times (174µs+2.10ms) by Method::Generate::Accessor::generate_method at line 179, avg 324µs/call
# 3 times (64µs+685µs) by Method::Generate::Accessor::_generate_getset at line 637, avg 250µs/call | ||||
400 | 10 | 4µs | my ($self, $name, $spec) = @_; | ||
401 | 10 | 6µs | my ($me, $source) = ('$_[0]', '$_[1]'); | ||
402 | 10 | 17µs | 10 | 84µs | if ($self->is_simple_set($name, $spec)) { # spent 84µs making 10 calls to Method::Generate::Accessor::is_simple_set, avg 8µs/call |
403 | return $self->_generate_simple_set($me, $name, $spec, $source); | ||||
404 | } | ||||
405 | |||||
406 | 10 | 10µs | my ($coerce, $trigger, $isa_check) = @{$spec}{qw(coerce trigger isa)}; | ||
407 | 10 | 10µs | 4 | 439µs | if ($coerce) { # spent 439µs making 4 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 110µs/call |
408 | $source = $self->_generate_coerce($name, $source, $coerce); | ||||
409 | } | ||||
410 | 10 | 135µs | 40 | 2.26ms | if ($isa_check) { # spent 1.84ms making 10 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 184µs/call
# spent 305µs making 10 calls to Method::Generate::Accessor::_generate_simple_set, avg 30µs/call
# spent 81µs making 10 calls to Method::Generate::Accessor::_generate_simple_get, avg 8µs/call
# spent 34µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 3µs/call |
411 | 'scalar do { my $value = '.$source.";\n" | ||||
412 | .' ('.$self->_generate_isa_check($name, '$value', $isa_check)."),\n" | ||||
413 | .' ('.$self->_generate_simple_set($me, $name, $spec, '$value')."),\n" | ||||
414 | .($trigger | ||||
415 | ? '('.$self->_generate_trigger($name, $me, '$value', $trigger)."),\n" | ||||
416 | : '') | ||||
417 | .' ('.$self->_generate_simple_get($me, $name, $spec)."),\n" | ||||
418 | ."}"; | ||||
419 | } | ||||
420 | elsif ($trigger) { | ||||
421 | my $set = $self->_generate_simple_set($me, $name, $spec, $source); | ||||
422 | "scalar (\n" | ||||
423 | . ' ('.$self->_generate_trigger($name, $me, "($set)", $trigger)."),\n" | ||||
424 | . ' ('.$self->_generate_simple_get($me, $name, $spec)."),\n" | ||||
425 | . ")"; | ||||
426 | } | ||||
427 | else { | ||||
428 | '('.$self->_generate_simple_set($me, $name, $spec, $source).')'; | ||||
429 | } | ||||
430 | } | ||||
431 | |||||
432 | sub generate_coerce { | ||||
433 | my $self = shift; | ||||
434 | $self->{captures} = {}; | ||||
435 | my $code = $self->_generate_coerce(@_); | ||||
436 | ($code, delete $self->{captures}); | ||||
437 | } | ||||
438 | |||||
439 | # spent 154µs (72+82) within Method::Generate::Accessor::_attr_desc which was called 17 times, avg 9µs/call:
# 17 times (72µs+82µs) by Method::Generate::Accessor::_wrap_attr_exception at line 477, avg 9µs/call | ||||
440 | 17 | 5µs | my ($name, $init_arg) = @_; | ||
441 | 17 | 59µs | 17 | 82µs | return quotify($name) if !defined($init_arg) or $init_arg eq $name; # spent 82µs making 17 calls to Sub::Quote::quotify, avg 5µs/call |
442 | return quotify($name).' (constructor argument: '.quotify($init_arg).')'; | ||||
443 | } | ||||
444 | |||||
445 | # spent 1.31ms (130µs+1.18) within Method::Generate::Accessor::_generate_coerce which was called 17 times, avg 77µs/call:
# 17 times (130µs+1.18ms) by MooX::TypeTiny::Role::GenerateAccessor::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/MooX/TypeTiny/Role/GenerateAccessor.pm:63] at line 42 of MooX/TypeTiny/Role/GenerateAccessor.pm, avg 77µs/call | ||||
446 | 17 | 25µs | my ($self, $name, $value, $coerce, $init_arg) = @_; | ||
447 | 17 | 105µs | 34 | 1.18ms | $self->_wrap_attr_exception( # spent 685µs making 17 calls to Method::Generate::Accessor::_wrap_attr_exception, avg 40µs/call
# spent 492µs making 17 calls to Method::Generate::Accessor::_generate_call_code, avg 29µs/call |
448 | $name, | ||||
449 | "coercion", | ||||
450 | $init_arg, | ||||
451 | $self->_generate_call_code($name, 'coerce', "${value}", $coerce), | ||||
452 | 1, | ||||
453 | ); | ||||
454 | } | ||||
455 | |||||
456 | sub generate_trigger { | ||||
457 | my $self = shift; | ||||
458 | $self->{captures} = {}; | ||||
459 | my $code = $self->_generate_trigger(@_); | ||||
460 | ($code, delete $self->{captures}); | ||||
461 | } | ||||
462 | |||||
463 | sub _generate_trigger { | ||||
464 | my ($self, $name, $obj, $value, $trigger) = @_; | ||||
465 | $self->_generate_call_code($name, 'trigger', "${obj}, ${value}", $trigger); | ||||
466 | } | ||||
467 | |||||
468 | sub generate_isa_check { | ||||
469 | my ($self, @args) = @_; | ||||
470 | $self->{captures} = {}; | ||||
471 | my $code = $self->_generate_isa_check(@args); | ||||
472 | ($code, delete $self->{captures}); | ||||
473 | } | ||||
474 | |||||
475 | # spent 685µs (255+430) within Method::Generate::Accessor::_wrap_attr_exception which was called 17 times, avg 40µs/call:
# 17 times (255µs+430µs) by Method::Generate::Accessor::_generate_coerce at line 447, avg 40µs/call | ||||
476 | 17 | 19µs | my ($self, $name, $step, $arg, $code, $want_return) = @_; | ||
477 | 17 | 66µs | 34 | 233µs | my $prefix = quotify("${step} for "._attr_desc($name, $arg).' failed: '); # spent 154µs making 17 calls to Method::Generate::Accessor::_attr_desc, avg 9µs/call
# spent 79µs making 17 calls to Sub::Quote::quotify, avg 5µs/call |
478 | 17 | 116µs | 51 | 197µs | "do {\n" # spent 197µs making 51 calls to Sub::Quote::quotify, avg 4µs/call |
479 | .' local $Method::Generate::Accessor::CurrentAttribute = {'."\n" | ||||
480 | .' init_arg => '.quotify($arg).",\n" | ||||
481 | .' name => '.quotify($name).",\n" | ||||
482 | .' step => '.quotify($step).",\n" | ||||
483 | ." };\n" | ||||
484 | .($want_return ? ' (my $_return),'."\n" : '') | ||||
485 | .' (my $_error), (my $_old_error = $@);'."\n" | ||||
486 | ." (eval {\n" | ||||
487 | .' ($@ = $_old_error),'."\n" | ||||
488 | .' (' | ||||
489 | .($want_return ? '$_return ='."\n" : '') | ||||
490 | .$code."),\n" | ||||
491 | ." 1\n" | ||||
492 | ." } or\n" | ||||
493 | .' $_error = CORE::ref $@ ? $@ : '.$prefix.'.$@);'."\n" | ||||
494 | .' ($@ = $_old_error),'."\n" | ||||
495 | .' (defined $_error and CORE::die $_error);'."\n" | ||||
496 | .($want_return ? ' $_return;'."\n" : '') | ||||
497 | ."}\n" | ||||
498 | } | ||||
499 | |||||
500 | sub _generate_isa_check { | ||||
501 | my ($self, $name, $value, $check, $init_arg) = @_; | ||||
502 | $self->_wrap_attr_exception( | ||||
503 | $name, | ||||
504 | "isa check", | ||||
505 | $init_arg, | ||||
506 | $self->_generate_call_code($name, 'isa_check', $value, $check) | ||||
507 | ); | ||||
508 | } | ||||
509 | |||||
510 | # spent 997µs (380+617) within Method::Generate::Accessor::_generate_call_code which was called 34 times, avg 29µs/call:
# 17 times (196µs+309µs) by Method::Generate::Accessor::_generate_get_default at line 376, avg 30µs/call
# 17 times (184µs+308µs) by Method::Generate::Accessor::_generate_coerce at line 447, avg 29µs/call | ||||
511 | 34 | 23µs | my ($self, $name, $type, $values, $sub) = @_; | ||
512 | 34 | 81µs | 34 | 15µs | $sub = \&{$sub} if blessed($sub); # coderef if blessed # spent 15µs making 34 calls to Scalar::Util::blessed, avg 441ns/call |
513 | 34 | 165µs | 34 | 147µs | if (my $quoted = quoted_from_sub($sub)) { # spent 147µs making 34 calls to Sub::Quote::quoted_from_sub, avg 4µs/call |
514 | my $local = 1; | ||||
515 | if ($values eq '@_' || $values eq '$_[0]') { | ||||
516 | $local = 0; | ||||
517 | $values = '@_'; | ||||
518 | } | ||||
519 | my $code = $quoted->[1]; | ||||
520 | if (my $captures = $quoted->[2]) { | ||||
521 | my $cap_name = qq{\$${type}_captures_for_}.sanitize_identifier($name); | ||||
522 | $self->{captures}->{$cap_name} = \$captures; | ||||
523 | Sub::Quote::inlinify($code, $values, | ||||
524 | Sub::Quote::capture_unroll($cap_name, $captures, 6), $local); | ||||
525 | } else { | ||||
526 | Sub::Quote::inlinify($code, $values, undef, $local); | ||||
527 | } | ||||
528 | } else { | ||||
529 | 34 | 91µs | 34 | 455µs | my $cap_name = qq{\$${type}_for_}.sanitize_identifier($name); # spent 455µs making 34 calls to Sub::Quote::sanitize_identifier, avg 13µs/call |
530 | 34 | 39µs | $self->{captures}->{$cap_name} = \$sub; | ||
531 | 34 | 16µs | "${cap_name}->(${values})"; | ||
532 | } | ||||
533 | } | ||||
534 | |||||
535 | sub _sanitize_name { sanitize_identifier($_[1]) } | ||||
536 | |||||
537 | # spent 16.4ms (219µs+16.1) within Method::Generate::Accessor::generate_populate_set which was called 55 times, avg 297µs/call:
# 55 times (219µs+16.1ms) by Method::Generate::Constructor::_assign_new at line 223 of Method/Generate/Constructor.pm, avg 297µs/call | ||||
538 | 55 | 16µs | my $self = shift; | ||
539 | 55 | 30µs | $self->{captures} = {}; | ||
540 | 55 | 76µs | 55 | 16.1ms | my $code = $self->_generate_populate_set(@_); # spent 16.1ms making 55 calls to Method::Generate::Accessor::_generate_populate_set, avg 293µs/call |
541 | 55 | 87µs | ($code, delete $self->{captures}); | ||
542 | } | ||||
543 | |||||
544 | # spent 16.1ms (1.14+15.0) within Method::Generate::Accessor::_generate_populate_set which was called 55 times, avg 293µs/call:
# 55 times (1.14ms+15.0ms) by Method::Generate::Accessor::generate_populate_set at line 540, avg 293µs/call | ||||
545 | 55 | 23µs | my ($self, $me, $name, $spec, $source, $test, $init_arg) = @_; | ||
546 | |||||
547 | 55 | 73µs | 55 | 99µs | my $has_default = $self->has_eager_default($name, $spec); # spent 99µs making 55 calls to Method::Generate::Accessor::has_eager_default, avg 2µs/call |
548 | 55 | 22µs | if (!($has_default || $test)) { | ||
549 | return ''; | ||||
550 | } | ||||
551 | 55 | 7µs | if ($has_default) { | ||
552 | 7 | 24µs | 7 | 99µs | my $get_default = $self->_generate_get_default($me, $name, $spec); # spent 99µs making 7 calls to Method::Generate::Accessor::_generate_get_default, avg 14µs/call |
553 | 7 | 7µs | $source = | ||
554 | $test | ||||
555 | ? "(\n ${test}\n" | ||||
556 | ." ? ${source}\n : " | ||||
557 | .$get_default | ||||
558 | .")" | ||||
559 | : $get_default; | ||||
560 | } | ||||
561 | 55 | 58µs | 11 | 1.14ms | if ($spec->{coerce}) { # spent 1.14ms making 11 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 104µs/call |
562 | $source = $self->_generate_coerce( | ||||
563 | $name, $source, | ||||
564 | $spec->{coerce}, $init_arg | ||||
565 | ) | ||||
566 | } | ||||
567 | 55 | 360µs | 92 | 12.7ms | if ($spec->{isa}) { # spent 12.6ms making 46 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 274µs/call
# spent 64µs making 46 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 1µs/call |
568 | $source = 'scalar do { my $value = '.$source.";\n" | ||||
569 | .' ('.$self->_generate_isa_check( | ||||
570 | $name, '$value', $spec->{isa}, $init_arg | ||||
571 | )."),\n" | ||||
572 | ." \$value\n" | ||||
573 | ."}\n"; | ||||
574 | } | ||||
575 | 55 | 85µs | 55 | 975µs | my $set = $self->_generate_simple_set($me, $name, $spec, $source); # spent 975µs making 55 calls to Method::Generate::Accessor::_generate_simple_set, avg 18µs/call |
576 | my $trigger = $spec->{trigger} ? $self->_generate_trigger( | ||||
577 | $name, $me, $self->_generate_simple_get($me, $name, $spec), | ||||
578 | $spec->{trigger} | ||||
579 | 55 | 31µs | ) : undef; | ||
580 | 55 | 151µs | if ($has_default) { | ||
581 | "($set)," . ($trigger && $test ? "($test and $trigger)," : '') . "\n"; | ||||
582 | } | ||||
583 | else { | ||||
584 | 48 | 49µs | "($test and ($set)" . ($trigger ? ", ($trigger)" : '') . "),\n"; | ||
585 | } | ||||
586 | } | ||||
587 | |||||
588 | # spent 645µs (348+297) within Method::Generate::Accessor::_generate_core_set which was called 82 times, avg 8µs/call:
# 82 times (348µs+297µs) by Method::Generate::Accessor::_generate_simple_set at line 597, avg 8µs/call | ||||
589 | 82 | 44µs | my ($self, $me, $name, $spec, $value) = @_; | ||
590 | 82 | 73µs | 82 | 297µs | my $name_str = quotify $name; # spent 297µs making 82 calls to Sub::Quote::quotify, avg 4µs/call |
591 | 82 | 181µs | "${me}->{${name_str}} = ${value}"; | ||
592 | } | ||||
593 | |||||
594 | # spent 1.70ms (587µs+1.12) within Method::Generate::Accessor::_generate_simple_set which was called 82 times, avg 21µs/call:
# 55 times (301µs+674µs) by Method::Generate::Accessor::_generate_populate_set at line 575, avg 18µs/call
# 17 times (149µs+274µs) by Method::Generate::Accessor::_generate_use_default at line 367, avg 25µs/call
# 10 times (137µs+168µs) by Method::Generate::Accessor::_generate_set at line 410, avg 30µs/call | ||||
595 | 82 | 56µs | my ($self, $me, $name, $spec, $value) = @_; | ||
596 | 82 | 97µs | 82 | 443µs | my $name_str = quotify $name; # spent 443µs making 82 calls to Sub::Quote::quotify, avg 5µs/call |
597 | 82 | 89µs | 82 | 645µs | my $simple = $self->_generate_core_set($me, $name, $spec, $value); # spent 645µs making 82 calls to Method::Generate::Accessor::_generate_core_set, avg 8µs/call |
598 | |||||
599 | 82 | 173µs | if ($spec->{weak_ref}) { | ||
600 | 4 | 4µs | require Scalar::Util; | ||
601 | 4 | 8µs | 4 | 28µs | my $get = $self->_generate_simple_get($me, $name, $spec); # spent 28µs making 4 calls to Method::Generate::Accessor::_generate_simple_get, avg 7µs/call |
602 | |||||
603 | # Perl < 5.8.3 can't weaken refs to readonly vars | ||||
604 | # (e.g. string constants). This *can* be solved by: | ||||
605 | # | ||||
606 | # &Internals::SvREADONLY($foo, 0); | ||||
607 | # Scalar::Util::weaken($foo); | ||||
608 | # &Internals::SvREADONLY($foo, 1); | ||||
609 | # | ||||
610 | # but requires Internal functions and is just too damn crazy | ||||
611 | # so simply throw a better exception | ||||
612 | 4 | 4µs | my $weak_simple = _CAN_WEAKEN_READONLY | ||
613 | ? "do { Scalar::Util::weaken(${simple}); no warnings 'void'; $get }" | ||||
614 | : <<"EOC" | ||||
615 | ( eval { Scalar::Util::weaken($simple); 1 } | ||||
616 | ? do { no warnings 'void'; $get } | ||||
617 | : do { | ||||
618 | if( \$@ =~ /Modification of a read-only value attempted/) { | ||||
619 | require Carp; | ||||
620 | Carp::croak( sprintf ( | ||||
621 | 'Reference to readonly value in "%s" can not be weakened on Perl < 5.8.3', | ||||
622 | $name_str, | ||||
623 | ) ); | ||||
624 | } else { | ||||
625 | die \$@; | ||||
626 | } | ||||
627 | } | ||||
628 | ) | ||||
629 | EOC | ||||
630 | } else { | ||||
631 | 78 | 24µs | $simple; | ||
632 | } | ||||
633 | } | ||||
634 | |||||
635 | # spent 823µs (25+798) within Method::Generate::Accessor::_generate_getset which was called 3 times, avg 274µs/call:
# 3 times (25µs+798µs) by Method::Generate::Accessor::generate_method at line 159, avg 274µs/call | ||||
636 | 3 | 1µs | my ($self, $name, $spec) = @_; | ||
637 | 3 | 21µs | 6 | 798µs | q{(@_ > 1}."\n ? ".$self->_generate_set($name, $spec) # spent 749µs making 3 calls to Method::Generate::Accessor::_generate_set, avg 250µs/call
# spent 49µs making 3 calls to Method::Generate::Accessor::_generate_get, avg 16µs/call |
638 | ."\n : ".$self->_generate_get($name, $spec)."\n )"; | ||||
639 | } | ||||
640 | |||||
641 | # spent 18.6ms (181µs+18.4) within Method::Generate::Accessor::_generate_asserter which was called 14 times, avg 1.33ms/call:
# 14 times (181µs+18.4ms) by Method::Generate::Accessor::generate_method at line 250, avg 1.33ms/call | ||||
642 | 14 | 8µs | my ($self, $name, $spec) = @_; | ||
643 | 14 | 24µs | 14 | 103µs | my $name_str = quotify($name); # spent 103µs making 14 calls to Sub::Quote::quotify, avg 7µs/call |
644 | 14 | 107µs | 28 | 18.3ms | "do {\n" # spent 18.2ms making 14 calls to Method::Generate::Accessor::_generate_get, avg 1.30ms/call
# spent 125µs making 14 calls to Method::Generate::Accessor::_generate_simple_has, avg 9µs/call |
645 | ." my \$val = ".$self->_generate_get($name, $spec).";\n" | ||||
646 | ." ".$self->_generate_simple_has('$_[0]', $name, $spec)."\n" | ||||
647 | ." or Carp::croak(q{Attempted to access '}.${name_str}.q{' but it is not set});\n" | ||||
648 | ." \$val;\n" | ||||
649 | ."}\n"; | ||||
650 | } | ||||
651 | # spent 160µs within Method::Generate::Accessor::_generate_delegation which was called 41 times, avg 4µs/call:
# 41 times (160µs+0s) by Method::Generate::Accessor::generate_method at line 238, avg 4µs/call | ||||
652 | 41 | 23µs | my ($self, $asserter, $target, $args) = @_; | ||
653 | 41 | 12µs | my $arg_string = do { | ||
654 | 41 | 25µs | if (@$args) { | ||
655 | # I could, I reckon, linearise out non-refs here using quotify | ||||
656 | # plus something to check for numbers but I'm unsure if it's worth it | ||||
657 | $self->{captures}{'@curries'} = $args; | ||||
658 | '@curries, @_'; | ||||
659 | } else { | ||||
660 | 41 | 11µs | '@_'; | ||
661 | } | ||||
662 | }; | ||||
663 | 41 | 112µs | "shift->${asserter}->${target}(${arg_string});"; | ||
664 | } | ||||
665 | |||||
666 | sub _generate_xs { | ||||
667 | my ($self, $type, $into, $name, $slot) = @_; | ||||
668 | Class::XSAccessor->import( | ||||
669 | class => $into, | ||||
670 | $type => { $name => $slot }, | ||||
671 | replace => 1, | ||||
672 | ); | ||||
673 | $into->can($name); | ||||
674 | } | ||||
675 | |||||
676 | 6 | 9µs | # spent 15µs within Method::Generate::Accessor::default_construction_string which was called 6 times, avg 2µs/call:
# 6 times (15µs+0s) by Method::Generate::Constructor::_build_construction_string at line 68 of Method/Generate/Constructor.pm, avg 2µs/call | ||
677 | |||||
678 | # spent 15.0ms (638µs+14.4) within Method::Generate::Accessor::_validate_codulatable which was called 86 times, avg 175µs/call:
# 57 times (538µs+14.4ms) by Method::Generate::Accessor::generate_method at line 103, avg 262µs/call
# 17 times (71µs+11µs) by Method::Generate::Accessor::generate_method at line 106, avg 5µs/call
# 12 times (29µs+4µs) by Method::Generate::Accessor::generate_method at line 119, avg 3µs/call | ||||
679 | 86 | 49µs | my ($self, $setting, $value, $into, $appended) = @_; | ||
680 | |||||
681 | 86 | 16µs | my $error; | ||
682 | |||||
683 | 86 | 403µs | 86 | 92µs | if (blessed $value) { # spent 92µs making 86 calls to Scalar::Util::blessed, avg 1µs/call |
684 | 47 | 5µs | local $@; | ||
685 | 2 | 191µs | 2 | 77µs | # spent 46µs (15+31) within Method::Generate::Accessor::BEGIN@685 which was called:
# once (15µs+31µs) by Moo::_accessor_maker_for at line 685 # spent 46µs making 1 call to Method::Generate::Accessor::BEGIN@685
# spent 31µs making 1 call to warnings::unimport |
686 | 141 | 305µs | 47 | 14.3ms | eval { \&$value; 1 } # spent 14.3ms making 47 calls to Type::Tiny::__ANON__[Type/Tiny.pm:89], avg 304µs/call |
687 | and return 1; | ||||
688 | $error = "could not be converted to a coderef: $@"; | ||||
689 | } | ||||
690 | elsif (ref $value eq 'CODE') { | ||||
691 | return 1; | ||||
692 | } | ||||
693 | else { | ||||
694 | $error = 'is not a coderef or code-convertible object'; | ||||
695 | } | ||||
696 | |||||
697 | croak "Invalid $setting '" | ||||
698 | . ($INC{'overload.pm'} ? overload::StrVal($value) : $value) | ||||
699 | . "' for $into " . $error | ||||
700 | . ($appended ? " $appended" : ''); | ||||
701 | } | ||||
702 | |||||
703 | 1 | 5µs | 1; | ||
# spent 25µs within Method::Generate::Accessor::CORE:subst which was called 49 times, avg 510ns/call:
# 49 times (25µs+0s) by Method::Generate::Accessor::generate_method at line 53, avg 510ns/call |