| Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Method/Generate/Accessor.pm |
| Statements | Executed 5206 statements in 15.0ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 4.53ms | 7.76ms | Method::Generate::Accessor::BEGIN@8 |
| 49 | 1 | 1 | 3.01ms | 90.2ms | Method::Generate::Accessor::generate_method |
| 55 | 1 | 1 | 1.13ms | 20.3ms | Method::Generate::Accessor::_generate_populate_set |
| 82 | 3 | 1 | 588µs | 1.77ms | Method::Generate::Accessor::_generate_simple_set |
| 86 | 3 | 1 | 588µs | 18.4ms | Method::Generate::Accessor::_validate_codulatable |
| 51 | 3 | 1 | 501µs | 18.9ms | Method::Generate::Accessor::_generate_get |
| 34 | 2 | 1 | 438µs | 1.11ms | Method::Generate::Accessor::_generate_call_code |
| 17 | 1 | 1 | 388µs | 17.5ms | Method::Generate::Accessor::_generate_use_default |
| 82 | 1 | 1 | 351µs | 666µs | Method::Generate::Accessor::_generate_core_set |
| 82 | 4 | 1 | 345µs | 882µs | Method::Generate::Accessor::_generate_simple_get |
| 55 | 1 | 1 | 281µs | 20.6ms | Method::Generate::Accessor::generate_populate_set |
| 17 | 1 | 1 | 242µs | 720µs | Method::Generate::Accessor::_wrap_attr_exception |
| 14 | 1 | 1 | 231µs | 16.4ms | Method::Generate::Accessor::_generate_asserter |
| 10 | 2 | 1 | 218µs | 3.10ms | Method::Generate::Accessor::_generate_set |
| 31 | 2 | 1 | 163µs | 282µs | Method::Generate::Accessor::_generate_simple_has |
| 41 | 1 | 1 | 159µs | 159µs | Method::Generate::Accessor::_generate_delegation |
| 17 | 1 | 1 | 139µs | 1.39ms | Method::Generate::Accessor::_generate_coerce |
| 24 | 2 | 1 | 138µs | 779µs | Method::Generate::Accessor::_generate_get_default |
| 51 | 1 | 1 | 119µs | 119µs | Method::Generate::Accessor::is_simple_get |
| 61 | 2 | 2 | 105µs | 105µs | Method::Generate::Accessor::has_eager_default |
| 2 | 1 | 1 | 79µs | 79µs | Method::Generate::Accessor::merge_specs |
| 10 | 1 | 1 | 75µs | 91µs | Method::Generate::Accessor::is_simple_set |
| 17 | 1 | 1 | 67µs | 178µs | Method::Generate::Accessor::_attr_desc |
| 1 | 1 | 1 | 43µs | 48µs | Method::Generate::Accessor::BEGIN@2 |
| 13 | 1 | 1 | 39µs | 39µs | Method::Generate::Accessor::has_default |
| 3 | 1 | 1 | 26µs | 634µs | Method::Generate::Accessor::_generate_getset |
| 49 | 1 | 1 | 23µs | 23µs | Method::Generate::Accessor::CORE:subst (opcode) |
| 1 | 1 | 1 | 13µs | 230µs | Method::Generate::Accessor::BEGIN@18 |
| 1 | 1 | 1 | 13µs | 56µs | Method::Generate::Accessor::BEGIN@5 |
| 1 | 1 | 1 | 13µs | 47µs | Method::Generate::Accessor::BEGIN@685 |
| 1 | 1 | 1 | 10µs | 10µs | Method::Generate::Accessor::BEGIN@7 |
| 1 | 1 | 1 | 9µs | 31µs | Method::Generate::Accessor::BEGIN@9 |
| 1 | 1 | 1 | 8µs | 46µs | Method::Generate::Accessor::BEGIN@3 |
| 1 | 1 | 1 | 7µs | 24µs | Method::Generate::Accessor::BEGIN@10 |
| 1 | 1 | 1 | 6µs | 6µs | Method::Generate::Accessor::BEGIN@34 |
| 6 | 1 | 1 | 6µs | 6µs | Method::Generate::Accessor::default_construction_string |
| 1 | 1 | 1 | 3µs | 3µs | Method::Generate::Accessor::BEGIN@11 |
| 1 | 1 | 1 | 3µs | 3µs | Method::Generate::Accessor::BEGIN@6 |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::__ANON__[:95] |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_die_overwrite |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_generate_isa_check |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_generate_simple_clear |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_generate_trigger |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_generate_xs |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::_sanitize_name |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_coerce |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_get_default |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_isa_check |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_simple_get |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_simple_has |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_trigger |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::generate_use_default |
| 0 | 0 | 0 | 0s | 0s | Method::Generate::Accessor::is_simple_attribute |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Method::Generate::Accessor; | ||||
| 2 | 2 | 46µs | 2 | 53µs | # spent 48µs (43+5) within Method::Generate::Accessor::BEGIN@2 which was called:
# once (43µs+5µs) by Moo::_accessor_maker_for at line 2 # spent 48µs making 1 call to Method::Generate::Accessor::BEGIN@2
# spent 5µs making 1 call to strict::import |
| 3 | 2 | 33µs | 2 | 84µs | # spent 46µs (8+38) within Method::Generate::Accessor::BEGIN@3 which was called:
# once (8µs+38µs) by Moo::_accessor_maker_for at line 3 # spent 46µs making 1 call to Method::Generate::Accessor::BEGIN@3
# spent 38µs making 1 call to warnings::import |
| 4 | |||||
| 5 | 2 | 33µs | 2 | 99µs | # spent 56µs (13+43) within Method::Generate::Accessor::BEGIN@5 which was called:
# once (13µs+43µs) by Moo::_accessor_maker_for at line 5 # spent 56µs making 1 call to Method::Generate::Accessor::BEGIN@5
# spent 43µs making 1 call to Exporter::import |
| 6 | 2 | 36µs | 1 | 3µs | # spent 3µs within Method::Generate::Accessor::BEGIN@6 which was called:
# once (3µs+0s) by Moo::_accessor_maker_for at line 6 # spent 3µs making 1 call to Method::Generate::Accessor::BEGIN@6 |
| 7 | 1 | 31µs | 1 | 10µs | # spent 10µs within Method::Generate::Accessor::BEGIN@7 which was called:
# once (10µs+0s) by Moo::_accessor_maker_for at line 7 # spent 10µs making 1 call to Method::Generate::Accessor::BEGIN@7 |
| 8 | 2 | 772µs | 2 | 7.84ms | # spent 7.76ms (4.53+3.23) within Method::Generate::Accessor::BEGIN@8 which was called:
# once (4.53ms+3.23ms) by Moo::_accessor_maker_for at line 8 # spent 7.76ms making 1 call to Method::Generate::Accessor::BEGIN@8
# spent 79µs making 1 call to Exporter::import |
| 9 | 2 | 28µs | 2 | 53µs | # spent 31µs (9+22) within Method::Generate::Accessor::BEGIN@9 which was called:
# once (9µs+22µs) by Moo::_accessor_maker_for at line 9 # spent 31µs making 1 call to Method::Generate::Accessor::BEGIN@9
# spent 22µs making 1 call to Exporter::import |
| 10 | 2 | 36µs | 2 | 41µs | # spent 24µs (7+17) within Method::Generate::Accessor::BEGIN@10 which was called:
# once (7µs+17µs) by Moo::_accessor_maker_for at line 10 # spent 24µs making 1 call to Method::Generate::Accessor::BEGIN@10
# spent 17µs making 1 call to Exporter::import |
| 11 | # spent 3µs within Method::Generate::Accessor::BEGIN@11 which was called:
# once (3µs+0s) by Moo::_accessor_maker_for at line 17 | ||||
| 12 | 1 | 4µs | our @CARP_NOT = qw( | ||
| 13 | Moo::_Utils | ||||
| 14 | Moo::Object | ||||
| 15 | Moo::Role | ||||
| 16 | ); | ||||
| 17 | 1 | 120µs | 1 | 3µs | } # spent 3µs making 1 call to Method::Generate::Accessor::BEGIN@11 |
| 18 | # spent 230µs (13+217) within Method::Generate::Accessor::BEGIN@18 which was called:
# once (13µs+217µ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 | 217µs | (eval { Class::XSAccessor->VERSION('1.07') }) # spent 217µ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 | 57µs | 1 | 230µs | } # spent 230µs making 1 call to Method::Generate::Accessor::BEGIN@18 |
| 34 | # spent 6µs within Method::Generate::Accessor::BEGIN@34 which was called:
# once (6µs+0s) by Moo::_accessor_maker_for at line 38 | ||||
| 35 | package | ||||
| 36 | Method::Generate::Accessor::_Generated; | ||||
| 37 | 1 | 5µs | $Carp::Internal{+__PACKAGE__} = 1; | ||
| 38 | 1 | 4.42ms | 1 | 6µs | } # spent 6µ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 90.2ms (3.01+87.1) within Method::Generate::Accessor::generate_method which was called 49 times, avg 1.84ms/call:
# 49 times (3.01ms+87.1ms) by Moo::has at line 121 of Moo.pm, avg 1.84ms/call | ||||
| 47 | 49 | 35µs | my ($self, $into, $name, $spec, $quote_opts) = @_; | ||
| 48 | $quote_opts = { | ||||
| 49 | no_defer => 1, | ||||
| 50 | package => 'Method::Generate::Accessor::_Generated', | ||||
| 51 | 49 | 129µs | %{ $quote_opts||{} }, | ||
| 52 | }; | ||||
| 53 | 49 | 107µs | 49 | 23µs | $spec->{allow_overwrite}++ if $name =~ s/^\+//; # spent 23µs making 49 calls to Method::Generate::Accessor::CORE:subst, avg 469ns/call |
| 54 | 49 | 35µs | croak "Must have an is" unless my $is = $spec->{is}; | ||
| 55 | 49 | 84µ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 | 7µs | $spec->{reader} = $name unless exists $spec->{reader}; | ||
| 66 | 6 | 8µs | $spec->{writer} = "_set_${name}" unless exists $spec->{writer}; | ||
| 67 | } elsif ($is ne 'bare') { | ||||
| 68 | croak "Unknown is ${is}"; | ||||
| 69 | } | ||||
| 70 | 49 | 11µ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 | 33µs | if (($spec->{predicate}||0) eq 1) { | ||
| 82 | $spec->{predicate} = $name =~ /^_/ ? "_has${name}" : "has_${name}"; | ||||
| 83 | } | ||||
| 84 | 49 | 26µs | if (($spec->{clearer}||0) eq 1) { | ||
| 85 | $spec->{clearer} = $name =~ /^_/ ? "_clear${name}" : "clear_${name}"; | ||||
| 86 | } | ||||
| 87 | 49 | 20µs | if (($spec->{trigger}||0) eq 1) { | ||
| 88 | $spec->{trigger} = quote_sub('shift->_trigger_'.$name.'(@_)'); | ||||
| 89 | } | ||||
| 90 | 49 | 25µ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 | 37µs | foreach my $setting (qw( isa coerce )) { | ||
| 102 | 98 | 42µs | next if !exists $spec->{$setting}; | ||
| 103 | 57 | 170µs | 57 | 18.3ms | $self->_validate_codulatable($setting, $spec->{$setting}, "$into->$name"); # spent 18.3ms making 57 calls to Method::Generate::Accessor::_validate_codulatable, avg 322µs/call |
| 104 | } | ||||
| 105 | |||||
| 106 | 49 | 71µs | 17 | 73µs | if (exists $spec->{default}) { # spent 73µs making 17 calls to Method::Generate::Accessor::_validate_codulatable, avg 4µ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 | 18µs | if (exists $spec->{moosify}) { | ||
| 114 | 12 | 15µs | if (ref $spec->{moosify} ne 'ARRAY') { | ||
| 115 | $spec->{moosify} = [$spec->{moosify}]; | ||||
| 116 | } | ||||
| 117 | |||||
| 118 | 12 | 14µs | foreach my $spec (@{$spec->{moosify}}) { | ||
| 119 | 12 | 17µs | 12 | 29µs | $self->_validate_codulatable('moosify', $spec, "$into->$name"); # spent 29µs making 12 calls to Method::Generate::Accessor::_validate_codulatable, avg 2µs/call |
| 120 | } | ||||
| 121 | } | ||||
| 122 | |||||
| 123 | 49 | 11µs | my %methods; | ||
| 124 | 49 | 63µs | if (my $reader = $spec->{reader}) { | ||
| 125 | _die_overwrite($into, $reader, 'a reader') | ||||
| 126 | 34 | 120µs | if !$spec->{allow_overwrite} && defined &{"${into}::${reader}"}; | ||
| 127 | 34 | 23µ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 | 32µ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 | 211µs | 68 | 18.3ms | => $quote_opts # spent 15.4ms making 34 calls to Sub::Quote::quote_sub, avg 453µs/call
# spent 2.92ms making 34 calls to Method::Generate::Accessor::_generate_get, avg 86µs/call |
| 139 | ; | ||||
| 140 | } | ||||
| 141 | } | ||||
| 142 | 49 | 33µ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 | 1µ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 | 20µs | 6 | 2.49ms | => $quote_opts # spent 1.86ms making 3 calls to Sub::Quote::quote_sub, avg 620µs/call
# spent 634µs making 3 calls to Method::Generate::Accessor::_generate_getset, avg 211µs/call |
| 160 | ; | ||||
| 161 | } | ||||
| 162 | } | ||||
| 163 | 49 | 30µs | if (my $writer = $spec->{writer}) { | ||
| 164 | _die_overwrite($into, $writer, 'a writer') | ||||
| 165 | 7 | 23µs | if !$spec->{allow_overwrite} && defined &{"${into}::${writer}"}; | ||
| 166 | 7 | 5µ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 | 7µs | $self->{captures} = {}; | ||
| 175 | $methods{$writer} = | ||||
| 176 | quote_sub "${into}::${writer}" | ||||
| 177 | => $self->_generate_set($name, $spec) | ||||
| 178 | => delete $self->{captures} | ||||
| 179 | 7 | 42µs | 14 | 6.79ms | => $quote_opts # spent 4.27ms making 7 calls to Sub::Quote::quote_sub, avg 610µs/call
# spent 2.52ms making 7 calls to Method::Generate::Accessor::_generate_set, avg 360µs/call |
| 180 | ; | ||||
| 181 | } | ||||
| 182 | } | ||||
| 183 | 49 | 26µ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 | 29µs | if (my $builder = delete $spec->{builder_sub}) { | ||
| 201 | _install_coderef( "${into}::$spec->{builder}" => $builder ); | ||||
| 202 | } | ||||
| 203 | 49 | 11µ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 | 38µs | if (my $hspec = $spec->{handles}) { | ||
| 215 | 14 | 21µs | my $asserter = $spec->{asserter} ||= '_assert_'.$name; | ||
| 216 | 14 | 17µs | my @specs = do { | ||
| 217 | 14 | 141µ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 | 32µ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 | 149µs | if !$spec->{allow_overwrite} && defined &{"${into}::${proxy}"}; | ||
| 233 | 41 | 38µs | $self->{captures} = {}; | ||
| 234 | $methods{$proxy} = | ||||
| 235 | quote_sub "${into}::${proxy}" | ||||
| 236 | => $self->_generate_delegation($asserter, $target, \@args) | ||||
| 237 | => delete $self->{captures} | ||||
| 238 | 41 | 267µs | 82 | 14.6ms | => $quote_opts # spent 14.4ms making 41 calls to Sub::Quote::quote_sub, avg 352µs/call
# spent 159µs making 41 calls to Method::Generate::Accessor::_generate_delegation, avg 4µs/call |
| 239 | ; | ||||
| 240 | } | ||||
| 241 | } | ||||
| 242 | 49 | 54µs | if (my $asserter = $spec->{asserter}) { | ||
| 243 | _die_overwrite($into, $asserter, 'an asserter') | ||||
| 244 | 14 | 47µs | if !$spec->{allow_overwrite} && defined &{"${into}::${asserter}"}; | ||
| 245 | 14 | 32µs | local $self->{captures} = {}; | ||
| 246 | $methods{$asserter} = | ||||
| 247 | quote_sub "${into}::${asserter}" | ||||
| 248 | => $self->_generate_asserter($name, $spec) | ||||
| 249 | => delete $self->{captures} | ||||
| 250 | 14 | 115µs | 28 | 26.5ms | => $quote_opts # spent 16.4ms making 14 calls to Method::Generate::Accessor::_generate_asserter, avg 1.17ms/call
# spent 10.0ms making 14 calls to Sub::Quote::quote_sub, avg 718µs/call |
| 251 | ; | ||||
| 252 | } | ||||
| 253 | 49 | 218µs | \%methods; | ||
| 254 | } | ||||
| 255 | |||||
| 256 | # spent 79µs within Method::Generate::Accessor::merge_specs which was called 2 times, avg 40µs/call:
# 2 times (79µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 27 of Method/Generate/Constructor.pm, avg 40µs/call | ||||
| 257 | 2 | 3µs | my ($self, @specs) = @_; | ||
| 258 | 2 | 2µs | my $spec = shift @specs; | ||
| 259 | 2 | 1µs | for my $old_spec (@specs) { | ||
| 260 | 2 | 4µs | foreach my $key (keys %$old_spec) { | ||
| 261 | 12 | 30µ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 | 11µ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 119µs within Method::Generate::Accessor::is_simple_get which was called 51 times, avg 2µs/call:
# 51 times (119µs+0s) by Method::Generate::Accessor::_generate_get at line 313, avg 2µs/call | ||||
| 291 | 51 | 24µs | my ($self, $name, $spec) = @_; | ||
| 292 | 51 | 179µs | !($spec->{lazy} and (exists $spec->{default} or $spec->{builder})); | ||
| 293 | } | ||||
| 294 | |||||
| 295 | # spent 91µs (75+16) within Method::Generate::Accessor::is_simple_set which was called 10 times, avg 9µs/call:
# 10 times (75µs+16µs) by Method::Generate::Accessor::_generate_set at line 402, avg 9µs/call | ||||
| 296 | 10 | 4µs | my ($self, $name, $spec) = @_; | ||
| 297 | 10 | 71µs | 10 | 16µs | !grep $spec->{$_}, qw(coerce isa trigger weak_ref); # spent 16µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 2µs/call |
| 298 | } | ||||
| 299 | |||||
| 300 | # spent 39µs within Method::Generate::Accessor::has_default which was called 13 times, avg 3µs/call:
# 13 times (39µs+0s) by Method::Generate::Constructor::register_attribute_specs at line 29 of Method/Generate/Constructor.pm, avg 3µs/call | ||||
| 301 | 13 | 8µs | my ($self, $name, $spec) = @_; | ||
| 302 | 13 | 35µs | $spec->{builder} or exists $spec->{default} or (($spec->{is}||'') eq 'lazy'); | ||
| 303 | } | ||||
| 304 | |||||
| 305 | # spent 105µs within Method::Generate::Accessor::has_eager_default which was called 61 times, avg 2µs/call:
# 55 times (97µs+0s) by Method::Generate::Accessor::_generate_populate_set at line 547, avg 2µs/call
# 6 times (8µs+0s) by Method::Generate::Constructor::_assign_new at line 214 of Method/Generate/Constructor.pm, avg 1µs/call | ||||
| 306 | 61 | 15µs | my ($self, $name, $spec) = @_; | ||
| 307 | 61 | 192µs | (!$spec->{lazy} and (exists $spec->{default} or $spec->{builder})); | ||
| 308 | } | ||||
| 309 | |||||
| 310 | # spent 18.9ms (501µs+18.4) within Method::Generate::Accessor::_generate_get which was called 51 times, avg 371µs/call:
# 34 times (261µs+2.65ms) by Method::Generate::Accessor::generate_method at line 138, avg 86µs/call
# 14 times (229µs+15.7ms) by Method::Generate::Accessor::_generate_asserter at line 644, avg 1.14ms/call
# 3 times (11µs+19µs) by Method::Generate::Accessor::_generate_getset at line 637, avg 10µs/call | ||||
| 311 | 51 | 25µs | my ($self, $name, $spec) = @_; | ||
| 312 | 51 | 107µs | 51 | 638µs | my $simple = $self->_generate_simple_get('$_[0]', $name, $spec); # spent 638µs making 51 calls to Method::Generate::Accessor::_generate_simple_get, avg 13µs/call |
| 313 | 51 | 184µs | 51 | 119µs | if ($self->is_simple_get($name, $spec)) { # spent 119µs making 51 calls to Method::Generate::Accessor::is_simple_get, avg 2µs/call |
| 314 | $simple; | ||||
| 315 | } else { | ||||
| 316 | 17 | 81µs | 34 | 17.7ms | $self->_generate_use_default( # spent 17.5ms making 17 calls to Method::Generate::Accessor::_generate_use_default, avg 1.03ms/call
# spent 143µs making 17 calls to Method::Generate::Accessor::_generate_simple_has, avg 8µ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 282µs (163+119) within Method::Generate::Accessor::_generate_simple_has which was called 31 times, avg 9µs/call:
# 17 times (78µs+65µs) by Method::Generate::Accessor::_generate_get at line 316, avg 8µs/call
# 14 times (85µs+54µs) by Method::Generate::Accessor::_generate_asserter at line 644, avg 10µs/call | ||||
| 331 | 31 | 14µs | my ($self, $me, $name) = @_; | ||
| 332 | 31 | 159µs | 31 | 119µs | "exists ${me}->{${\quotify $name}}"; # spent 119µs making 31 calls to Sub::Quote::quotify, avg 4µ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 17.5ms (388µs+17.1) within Method::Generate::Accessor::_generate_use_default which was called 17 times, avg 1.03ms/call:
# 17 times (388µs+17.1ms) by Method::Generate::Accessor::_generate_get at line 316, avg 1.03ms/call | ||||
| 355 | 17 | 15µs | my ($self, $me, $name, $spec, $test) = @_; | ||
| 356 | 17 | 66µs | 17 | 679µs | my $get_value = $self->_generate_get_default($me, $name, $spec); # spent 679µs making 17 calls to Method::Generate::Accessor::_generate_get_default, avg 40µs/call |
| 357 | 17 | 16µs | 2 | 261µs | if ($spec->{coerce}) { # spent 261µs making 2 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 130µ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 | 274µs | 68 | 16.2ms | ." ".$self->_generate_isa_check($name, '$value', $spec->{isa}).";\n" # spent 15.6ms making 17 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 918µs/call
# spent 404µs making 17 calls to Method::Generate::Accessor::_generate_simple_set, avg 24µs/call
# spent 132µs making 17 calls to Method::Generate::Accessor::_generate_simple_get, avg 8µs/call
# spent 40µ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 779µs (138+641) within Method::Generate::Accessor::_generate_get_default which was called 24 times, avg 32µs/call:
# 17 times (97µs+582µs) by Method::Generate::Accessor::_generate_use_default at line 356, avg 40µs/call
# 7 times (41µs+59µs) by Method::Generate::Accessor::_generate_populate_set at line 552, avg 14µs/call | ||||
| 375 | 24 | 17µs | my ($self, $me, $name, $spec) = @_; | ||
| 376 | 24 | 115µs | 24 | 641µs | if (exists $spec->{default}) { # spent 582µs making 17 calls to Method::Generate::Accessor::_generate_call_code, avg 34µs/call
# spent 59µ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 882µs (345+537) within Method::Generate::Accessor::_generate_simple_get which was called 82 times, avg 11µs/call:
# 51 times (239µs+399µs) by Method::Generate::Accessor::_generate_get at line 312, avg 13µs/call
# 17 times (49µs+83µs) by Method::Generate::Accessor::_generate_use_default at line 367, avg 8µs/call
# 10 times (35µs+36µs) by Method::Generate::Accessor::_generate_set at line 410, avg 7µs/call
# 4 times (22µs+19µs) by Method::Generate::Accessor::_generate_simple_set at line 601, avg 10µs/call | ||||
| 394 | 82 | 46µs | my ($self, $me, $name) = @_; | ||
| 395 | 82 | 119µs | 82 | 537µs | my $name_str = quotify $name; # spent 537µs making 82 calls to Sub::Quote::quotify, avg 7µs/call |
| 396 | 82 | 180µs | "${me}->{${name_str}}"; | ||
| 397 | } | ||||
| 398 | |||||
| 399 | # spent 3.10ms (218µs+2.88) within Method::Generate::Accessor::_generate_set which was called 10 times, avg 310µs/call:
# 7 times (170µs+2.35ms) by Method::Generate::Accessor::generate_method at line 179, avg 360µs/call
# 3 times (48µs+530µs) by Method::Generate::Accessor::_generate_getset at line 637, avg 193µs/call | ||||
| 400 | 10 | 1µs | my ($self, $name, $spec) = @_; | ||
| 401 | 10 | 7µs | my ($me, $source) = ('$_[0]', '$_[1]'); | ||
| 402 | 10 | 21µs | 10 | 91µs | if ($self->is_simple_set($name, $spec)) { # spent 91µs making 10 calls to Method::Generate::Accessor::is_simple_set, avg 9µs/call |
| 403 | return $self->_generate_simple_set($me, $name, $spec, $source); | ||||
| 404 | } | ||||
| 405 | |||||
| 406 | 10 | 11µs | my ($coerce, $trigger, $isa_check) = @{$spec}{qw(coerce trigger isa)}; | ||
| 407 | 10 | 17µs | 4 | 505µs | if ($coerce) { # spent 505µs making 4 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 126µs/call |
| 408 | $source = $self->_generate_coerce($name, $source, $coerce); | ||||
| 409 | } | ||||
| 410 | 10 | 136µs | 40 | 2.28ms | if ($isa_check) { # spent 1.98ms making 10 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 198µs/call
# spent 223µs making 10 calls to Method::Generate::Accessor::_generate_simple_set, avg 22µs/call
# spent 71µs making 10 calls to Method::Generate::Accessor::_generate_simple_get, avg 7µs/call
# spent 9µs making 10 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 900ns/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 178µs (67+111) within Method::Generate::Accessor::_attr_desc which was called 17 times, avg 10µs/call:
# 17 times (67µs+111µs) by Method::Generate::Accessor::_wrap_attr_exception at line 477, avg 10µs/call | ||||
| 440 | 17 | 5µs | my ($name, $init_arg) = @_; | ||
| 441 | 17 | 55µs | 17 | 111µs | return quotify($name) if !defined($init_arg) or $init_arg eq $name; # spent 111µs making 17 calls to Sub::Quote::quotify, avg 7µs/call |
| 442 | return quotify($name).' (constructor argument: '.quotify($init_arg).')'; | ||||
| 443 | } | ||||
| 444 | |||||
| 445 | # spent 1.39ms (139µs+1.25) within Method::Generate::Accessor::_generate_coerce which was called 17 times, avg 82µs/call:
# 17 times (139µs+1.25ms) 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 82µs/call | ||||
| 446 | 17 | 12µs | my ($self, $name, $value, $coerce, $init_arg) = @_; | ||
| 447 | 17 | 112µs | 34 | 1.25ms | $self->_wrap_attr_exception( # spent 720µs making 17 calls to Method::Generate::Accessor::_wrap_attr_exception, avg 42µs/call
# spent 527µs making 17 calls to Method::Generate::Accessor::_generate_call_code, avg 31µ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 720µs (242+478) within Method::Generate::Accessor::_wrap_attr_exception which was called 17 times, avg 42µs/call:
# 17 times (242µs+478µs) by Method::Generate::Accessor::_generate_coerce at line 447, avg 42µs/call | ||||
| 476 | 17 | 15µs | my ($self, $name, $step, $arg, $code, $want_return) = @_; | ||
| 477 | 17 | 69µs | 34 | 302µs | my $prefix = quotify("${step} for "._attr_desc($name, $arg).' failed: '); # spent 178µs making 17 calls to Method::Generate::Accessor::_attr_desc, avg 10µs/call
# spent 124µs making 17 calls to Sub::Quote::quotify, avg 7µs/call |
| 478 | 17 | 120µs | 51 | 176µs | "do {\n" # spent 176µs making 51 calls to Sub::Quote::quotify, avg 3µ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 1.11ms (438µs+671µs) within Method::Generate::Accessor::_generate_call_code which was called 34 times, avg 33µs/call:
# 17 times (226µs+356µs) by Method::Generate::Accessor::_generate_get_default at line 376, avg 34µs/call
# 17 times (212µs+315µs) by Method::Generate::Accessor::_generate_coerce at line 447, avg 31µs/call | ||||
| 511 | 34 | 30µs | my ($self, $name, $type, $values, $sub) = @_; | ||
| 512 | 34 | 93µs | 34 | 20µs | $sub = \&{$sub} if blessed($sub); # coderef if blessed # spent 20µs making 34 calls to Scalar::Util::blessed, avg 588ns/call |
| 513 | 34 | 155µs | 34 | 122µs | if (my $quoted = quoted_from_sub($sub)) { # spent 122µ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 | 105µs | 34 | 529µs | my $cap_name = qq{\$${type}_for_}.sanitize_identifier($name); # spent 529µs making 34 calls to Sub::Quote::sanitize_identifier, avg 16µs/call |
| 530 | 34 | 47µs | $self->{captures}->{$cap_name} = \$sub; | ||
| 531 | 34 | 17µs | "${cap_name}->(${values})"; | ||
| 532 | } | ||||
| 533 | } | ||||
| 534 | |||||
| 535 | sub _sanitize_name { sanitize_identifier($_[1]) } | ||||
| 536 | |||||
| 537 | # spent 20.6ms (281µs+20.3) within Method::Generate::Accessor::generate_populate_set which was called 55 times, avg 375µs/call:
# 55 times (281µs+20.3ms) by Method::Generate::Constructor::_assign_new at line 223 of Method/Generate/Constructor.pm, avg 375µs/call | ||||
| 538 | 55 | 16µs | my $self = shift; | ||
| 539 | 55 | 38µs | $self->{captures} = {}; | ||
| 540 | 55 | 79µs | 55 | 20.3ms | my $code = $self->_generate_populate_set(@_); # spent 20.3ms making 55 calls to Method::Generate::Accessor::_generate_populate_set, avg 370µs/call |
| 541 | 55 | 115µs | ($code, delete $self->{captures}); | ||
| 542 | } | ||||
| 543 | |||||
| 544 | # spent 20.3ms (1.13+19.2) within Method::Generate::Accessor::_generate_populate_set which was called 55 times, avg 370µs/call:
# 55 times (1.13ms+19.2ms) by Method::Generate::Accessor::generate_populate_set at line 540, avg 370µs/call | ||||
| 545 | 55 | 28µs | my ($self, $me, $name, $spec, $source, $test, $init_arg) = @_; | ||
| 546 | |||||
| 547 | 55 | 75µs | 55 | 97µs | my $has_default = $self->has_eager_default($name, $spec); # spent 97µs making 55 calls to Method::Generate::Accessor::has_eager_default, avg 2µs/call |
| 548 | 55 | 14µs | if (!($has_default || $test)) { | ||
| 549 | return ''; | ||||
| 550 | } | ||||
| 551 | 55 | 7µs | if ($has_default) { | ||
| 552 | 7 | 16µs | 7 | 100µs | my $get_default = $self->_generate_get_default($me, $name, $spec); # spent 100µs making 7 calls to Method::Generate::Accessor::_generate_get_default, avg 14µs/call |
| 553 | 7 | 11µs | $source = | ||
| 554 | $test | ||||
| 555 | ? "(\n ${test}\n" | ||||
| 556 | ." ? ${source}\n : " | ||||
| 557 | .$get_default | ||||
| 558 | .")" | ||||
| 559 | : $get_default; | ||||
| 560 | } | ||||
| 561 | 55 | 50µs | 11 | 1.20ms | if ($spec->{coerce}) { # spent 1.20ms making 11 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_coerce, avg 109µs/call |
| 562 | $source = $self->_generate_coerce( | ||||
| 563 | $name, $source, | ||||
| 564 | $spec->{coerce}, $init_arg | ||||
| 565 | ) | ||||
| 566 | } | ||||
| 567 | 55 | 357µs | 92 | 16.7ms | if ($spec->{isa}) { # spent 16.6ms making 46 calls to Method::Generate::Accessor__WITH__MooX::TypeTiny::Role::GenerateAccessor::_generate_isa_check, avg 361µs/call
# spent 79µs making 46 calls to Type::Tiny::__ANON__[Type/Tiny.pm:101], avg 2µ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 | 101µs | 55 | 1.15ms | my $set = $self->_generate_simple_set($me, $name, $spec, $source); # spent 1.15ms making 55 calls to Method::Generate::Accessor::_generate_simple_set, avg 21µ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 | 34µs | ) : undef; | ||
| 580 | 55 | 173µs | if ($has_default) { | ||
| 581 | "($set)," . ($trigger && $test ? "($test and $trigger)," : '') . "\n"; | ||||
| 582 | } | ||||
| 583 | else { | ||||
| 584 | 48 | 70µs | "($test and ($set)" . ($trigger ? ", ($trigger)" : '') . "),\n"; | ||
| 585 | } | ||||
| 586 | } | ||||
| 587 | |||||
| 588 | # spent 666µs (351+315) within Method::Generate::Accessor::_generate_core_set which was called 82 times, avg 8µs/call:
# 82 times (351µs+315µs) by Method::Generate::Accessor::_generate_simple_set at line 597, avg 8µs/call | ||||
| 589 | 82 | 35µs | my ($self, $me, $name, $spec, $value) = @_; | ||
| 590 | 82 | 78µs | 82 | 315µs | my $name_str = quotify $name; # spent 315µs making 82 calls to Sub::Quote::quotify, avg 4µs/call |
| 591 | 82 | 216µs | "${me}->{${name_str}} = ${value}"; | ||
| 592 | } | ||||
| 593 | |||||
| 594 | # spent 1.77ms (588µs+1.19) within Method::Generate::Accessor::_generate_simple_set which was called 82 times, avg 22µs/call:
# 55 times (347µs+801µs) by Method::Generate::Accessor::_generate_populate_set at line 575, avg 21µs/call
# 17 times (152µs+252µs) by Method::Generate::Accessor::_generate_use_default at line 367, avg 24µs/call
# 10 times (89µs+134µs) by Method::Generate::Accessor::_generate_set at line 410, avg 22µs/call | ||||
| 595 | 82 | 63µs | my ($self, $me, $name, $spec, $value) = @_; | ||
| 596 | 82 | 112µs | 82 | 480µs | my $name_str = quotify $name; # spent 480µs making 82 calls to Sub::Quote::quotify, avg 6µs/call |
| 597 | 82 | 95µs | 82 | 666µs | my $simple = $self->_generate_core_set($me, $name, $spec, $value); # spent 666µs making 82 calls to Method::Generate::Accessor::_generate_core_set, avg 8µs/call |
| 598 | |||||
| 599 | 82 | 199µs | if ($spec->{weak_ref}) { | ||
| 600 | 4 | 8µs | require Scalar::Util; | ||
| 601 | 4 | 11µs | 4 | 41µs | my $get = $self->_generate_simple_get($me, $name, $spec); # spent 41µs making 4 calls to Method::Generate::Accessor::_generate_simple_get, avg 10µ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 | 5µ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 634µs (26+608) within Method::Generate::Accessor::_generate_getset which was called 3 times, avg 211µs/call:
# 3 times (26µs+608µs) by Method::Generate::Accessor::generate_method at line 159, avg 211µs/call | ||||
| 636 | 3 | 1µs | my ($self, $name, $spec) = @_; | ||
| 637 | 3 | 88µs | 6 | 608µs | q{(@_ > 1}."\n ? ".$self->_generate_set($name, $spec) # spent 578µs making 3 calls to Method::Generate::Accessor::_generate_set, avg 193µs/call
# spent 30µs making 3 calls to Method::Generate::Accessor::_generate_get, avg 10µs/call |
| 638 | ."\n : ".$self->_generate_get($name, $spec)."\n )"; | ||||
| 639 | } | ||||
| 640 | |||||
| 641 | # spent 16.4ms (231µs+16.2) within Method::Generate::Accessor::_generate_asserter which was called 14 times, avg 1.17ms/call:
# 14 times (231µs+16.2ms) by Method::Generate::Accessor::generate_method at line 250, avg 1.17ms/call | ||||
| 642 | 14 | 9µs | my ($self, $name, $spec) = @_; | ||
| 643 | 14 | 50µs | 14 | 108µs | my $name_str = quotify($name); # spent 108µs making 14 calls to Sub::Quote::quotify, avg 8µs/call |
| 644 | 14 | 127µs | 28 | 16.1ms | "do {\n" # spent 16.0ms making 14 calls to Method::Generate::Accessor::_generate_get, avg 1.14ms/call
# spent 139µs making 14 calls to Method::Generate::Accessor::_generate_simple_has, avg 10µ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 159µs within Method::Generate::Accessor::_generate_delegation which was called 41 times, avg 4µs/call:
# 41 times (159µs+0s) by Method::Generate::Accessor::generate_method at line 238, avg 4µs/call | ||||
| 652 | 41 | 15µs | my ($self, $asserter, $target, $args) = @_; | ||
| 653 | 41 | 18µs | my $arg_string = do { | ||
| 654 | 41 | 23µ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 | 17µs | '@_'; | ||
| 661 | } | ||||
| 662 | }; | ||||
| 663 | 41 | 109µ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 | 11µs | # spent 6µs within Method::Generate::Accessor::default_construction_string which was called 6 times, avg 1µs/call:
# 6 times (6µs+0s) by Method::Generate::Constructor::_build_construction_string at line 68 of Method/Generate/Constructor.pm, avg 1µs/call | ||
| 677 | |||||
| 678 | # spent 18.4ms (588µs+17.9) within Method::Generate::Accessor::_validate_codulatable which was called 86 times, avg 214µs/call:
# 57 times (494µs+17.8ms) by Method::Generate::Accessor::generate_method at line 103, avg 322µs/call
# 17 times (68µs+5µs) by Method::Generate::Accessor::generate_method at line 106, avg 4µs/call
# 12 times (26µs+3µs) by Method::Generate::Accessor::generate_method at line 119, avg 2µs/call | ||||
| 679 | 86 | 35µs | my ($self, $setting, $value, $into, $appended) = @_; | ||
| 680 | |||||
| 681 | 86 | 16µs | my $error; | ||
| 682 | |||||
| 683 | 86 | 371µs | 86 | 79µs | if (blessed $value) { # spent 79µs making 86 calls to Scalar::Util::blessed, avg 919ns/call |
| 684 | 47 | 11µs | local $@; | ||
| 685 | 2 | 285µs | 2 | 81µs | # spent 47µs (13+34) within Method::Generate::Accessor::BEGIN@685 which was called:
# once (13µs+34µs) by Moo::_accessor_maker_for at line 685 # spent 47µs making 1 call to Method::Generate::Accessor::BEGIN@685
# spent 34µs making 1 call to warnings::unimport |
| 686 | 141 | 329µs | 47 | 17.8ms | eval { \&$value; 1 } # spent 17.8ms making 47 calls to Type::Tiny::__ANON__[Type/Tiny.pm:89], avg 378µ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 | 7µs | 1; | ||
# spent 23µs within Method::Generate::Accessor::CORE:subst which was called 49 times, avg 469ns/call:
# 49 times (23µs+0s) by Method::Generate::Accessor::generate_method at line 53, avg 469ns/call |