| Filename | /Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm |
| Statements | Executed 10310 statements in 10.3ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 38 | 1 | 1 | 2.42ms | 24.5ms | Sub::Exporter::_do_import |
| 364 | 1 | 1 | 1.74ms | 4.07ms | Sub::Exporter::default_generator |
| 96 | 2 | 1 | 1.67ms | 5.27ms | Sub::Exporter::_expand_groups (recurses: max depth 2, inclusive time 5.25ms) |
| 38 | 3 | 2 | 1.61ms | 14.1ms | Sub::Exporter::default_installer |
| 58 | 1 | 1 | 711µs | 4.77ms | Sub::Exporter::_expand_group (recurses: max depth 1, inclusive time 3.56ms) |
| 38 | 13 | 12 | 710µs | 31.4ms | Sub::Exporter::__ANON__[:337] |
| 480 | 2 | 1 | 592µs | 592µs | Sub::Exporter::_group_name |
| 38 | 1 | 1 | 453µs | 648µs | Sub::Exporter::_collect_collections |
| 38 | 1 | 1 | 175µs | 175µs | Sub::Exporter::_mk_collection_builder |
| 6 | 1 | 1 | 168µs | 1.59ms | Sub::Exporter::_rewrite_build_config |
| 6 | 1 | 1 | 46µs | 46µs | Sub::Exporter::_key_intersection |
| 6 | 3 | 2 | 37µs | 1.63ms | Sub::Exporter::build_exporter |
| 6 | 1 | 1 | 21µs | 23µs | Sub::Exporter::_assert_collector_names_ok |
| 2 | 2 | 2 | 20µs | 499µs | Sub::Exporter::setup_exporter |
| 1 | 1 | 1 | 15µs | 15µs | Moose::Exporter::BEGIN@1 |
| 1 | 1 | 1 | 13µs | 20µs | Sub::Exporter::__ANON__[:159] |
| 1 | 1 | 1 | 9µs | 9µs | Sub::Exporter::BEGIN@217 |
| 1 | 1 | 1 | 9µs | 19µs | Moose::Exporter::BEGIN@2.1 |
| 1 | 1 | 1 | 9µs | 15µs | Sub::Exporter::BEGIN@12 |
| 1 | 1 | 1 | 9µs | 16µs | Sub::Exporter::BEGIN@11 |
| 1 | 1 | 1 | 6µs | 12µs | Sub::Exporter::BEGIN@13 |
| 1 | 1 | 1 | 6µs | 9µs | Moose::Exporter::BEGIN@3 |
| 1 | 1 | 1 | 6µs | 6µs | Sub::Exporter::_setup |
| 1 | 1 | 1 | 4µs | 83µs | Sub::Exporter::__ANON__[:460] |
| 1 | 1 | 1 | 3µs | 3µs | Sub::Exporter::BEGIN@10 |
| 1 | 1 | 1 | 2µs | 2µs | Sub::Exporter::CORE:match (opcode) |
| 0 | 0 | 0 | 0s | 0s | Sub::Exporter::__ANON__[:354] |
| 0 | 0 | 0 | 0s | 0s | Sub::Exporter::default_exporter |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | 2 | 38µs | 1 | 15µs | # spent 15µs within Moose::Exporter::BEGIN@1 which was called:
# once (15µs+0s) by Moose::Exporter::BEGIN@17 at line 1 # spent 15µs making 1 call to Moose::Exporter::BEGIN@1 |
| 2 | 2 | 19µs | 2 | 29µs | # spent 19µs (9+10) within Moose::Exporter::BEGIN@2.1 which was called:
# once (9µs+10µs) by Moose::Exporter::BEGIN@17 at line 2 # spent 19µs making 1 call to Moose::Exporter::BEGIN@2.1
# spent 10µs making 1 call to strict::import |
| 3 | 2 | 34µs | 2 | 12µs | # spent 9µs (6+3) within Moose::Exporter::BEGIN@3 which was called:
# once (6µs+3µs) by Moose::Exporter::BEGIN@17 at line 3 # spent 9µs making 1 call to Moose::Exporter::BEGIN@3
# spent 3µs making 1 call to warnings::import |
| 4 | package Sub::Exporter; | ||||
| 5 | { | ||||
| 6 | 2 | 800ns | $Sub::Exporter::VERSION = '0.986'; | ||
| 7 | } | ||||
| 8 | # ABSTRACT: a sophisticated exporter for custom-built routines | ||||
| 9 | |||||
| 10 | 2 | 20µs | 1 | 3µs | # spent 3µs within Sub::Exporter::BEGIN@10 which was called:
# once (3µs+0s) by Moose::Exporter::BEGIN@17 at line 10 # spent 3µs making 1 call to Sub::Exporter::BEGIN@10 |
| 11 | 3 | 32µs | 2 | 23µs | # spent 16µs (9+7) within Sub::Exporter::BEGIN@11 which was called:
# once (9µs+7µs) by Moose::Exporter::BEGIN@17 at line 11 # spent 16µs making 1 call to Sub::Exporter::BEGIN@11
# spent 7µs making 1 call to UNIVERSAL::VERSION |
| 12 | 3 | 30µs | 2 | 21µs | # spent 15µs (9+6) within Sub::Exporter::BEGIN@12 which was called:
# once (9µs+6µs) by Moose::Exporter::BEGIN@17 at line 12 # spent 15µs making 1 call to Sub::Exporter::BEGIN@12
# spent 6µs making 1 call to UNIVERSAL::VERSION |
| 13 | 3 | 833µs | 2 | 18µs | # spent 12µs (6+6) within Sub::Exporter::BEGIN@13 which was called:
# once (6µs+6µs) by Moose::Exporter::BEGIN@17 at line 13 # spent 12µs making 1 call to Sub::Exporter::BEGIN@13
# spent 6µs making 1 call to UNIVERSAL::VERSION |
| 14 | |||||
| 15 | |||||
| 16 | # Given a potential import name, this returns the group name -- if it's got a | ||||
| 17 | # group prefix. | ||||
| 18 | sub _group_name { | ||||
| 19 | 480 | 60µs | my ($name) = @_; | ||
| 20 | |||||
| 21 | 480 | 542µs | return if (index q{-:}, (substr $name, 0, 1)) == -1; | ||
| 22 | 116 | 178µs | return substr $name, 1; | ||
| 23 | } | ||||
| 24 | |||||
| 25 | # \@groups is a canonicalized opt list of exports and groups this returns | ||||
| 26 | # another canonicalized opt list with groups replaced with relevant exports. | ||||
| 27 | # \%seen is groups we've already expanded and can ignore. | ||||
| 28 | # \%merge is merged options from the group we're descending through. | ||||
| 29 | # spent 5.27ms (1.67+3.59) within Sub::Exporter::_expand_groups which was called 96 times, avg 55µs/call:
# 58 times (1.26ms+-1.26ms) by Sub::Exporter::_expand_group at line 124, avg 0s/call
# 38 times (410µs+4.86ms) by Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:337] at line 323, avg 139µs/call | ||||
| 30 | 96 | 32µs | my ($class, $config, $groups, $collection, $seen, $merge) = @_; | ||
| 31 | 96 | 16µs | $seen ||= {}; | ||
| 32 | 96 | 6µs | $merge ||= {}; | ||
| 33 | 96 | 50µs | my @groups = @$groups; | ||
| 34 | |||||
| 35 | 96 | 131µs | for my $i (reverse 0 .. $#groups) { | ||
| 36 | 422 | 375µs | 422 | 519µs | if (my $group_name = _group_name($groups[$i][0])) { # spent 519µs making 422 calls to Sub::Exporter::_group_name, avg 1µs/call |
| 37 | 58 | 53µs | my $seen = { %$seen }; # faux-dynamic scoping | ||
| 38 | |||||
| 39 | 58 | 135µs | 58 | 4.77ms | splice @groups, $i, 1, # spent 8.32ms making 58 calls to Sub::Exporter::_expand_group, avg 143µs/call, recursion: max depth 1, sum of overlapping time 3.56ms |
| 40 | _expand_group($class, $config, $groups[$i], $collection, $seen, $merge); | ||||
| 41 | } else { | ||||
| 42 | # there's nothing to munge in this export's args | ||||
| 43 | 364 | 167µs | next unless my %merge = %$merge; | ||
| 44 | |||||
| 45 | # we have things to merge in; do so | ||||
| 46 | my $prefix = (delete $merge{-prefix}) || ''; | ||||
| 47 | my $suffix = (delete $merge{-suffix}) || ''; | ||||
| 48 | |||||
| 49 | if ( | ||||
| 50 | Params::Util::_CODELIKE($groups[$i][1]) ## no critic Private | ||||
| 51 | or | ||||
| 52 | Params::Util::_SCALAR0($groups[$i][1]) ## no critic Private | ||||
| 53 | ) { | ||||
| 54 | # this entry was build by a group generator | ||||
| 55 | $groups[$i][0] = $prefix . $groups[$i][0] . $suffix; | ||||
| 56 | } else { | ||||
| 57 | my $as | ||||
| 58 | = ref $groups[$i][1]{-as} ? $groups[$i][1]{-as} | ||||
| 59 | : $groups[$i][1]{-as} ? $prefix . $groups[$i][1]{-as} . $suffix | ||||
| 60 | : $prefix . $groups[$i][0] . $suffix; | ||||
| 61 | |||||
| 62 | $groups[$i][1] = { %{ $groups[$i][1] }, %merge, -as => $as }; | ||||
| 63 | } | ||||
| 64 | } | ||||
| 65 | } | ||||
| 66 | |||||
| 67 | 96 | 165µs | return \@groups; | ||
| 68 | } | ||||
| 69 | |||||
| 70 | # \@group is a name/value pair from an opt list. | ||||
| 71 | # spent 4.77ms (711µs+4.06) within Sub::Exporter::_expand_group which was called 58 times, avg 82µs/call:
# 58 times (711µs+4.06ms) by Sub::Exporter::_expand_groups at line 39, avg 82µs/call | ||||
| 72 | 58 | 17µs | my ($class, $config, $group, $collection, $seen, $merge) = @_; | ||
| 73 | 58 | 3µs | $merge ||= {}; | ||
| 74 | |||||
| 75 | 58 | 14µs | my ($group_name, $group_arg) = @$group; | ||
| 76 | 58 | 38µs | 58 | 73µs | $group_name = _group_name($group_name); # spent 73µs making 58 calls to Sub::Exporter::_group_name, avg 1µs/call |
| 77 | |||||
| 78 | 58 | 22µs | Carp::croak qq(group "$group_name" is not exported by the $class module) | ||
| 79 | unless exists $config->{groups}{$group_name}; | ||||
| 80 | |||||
| 81 | 58 | 29µs | return if $seen->{$group_name}++; | ||
| 82 | |||||
| 83 | 58 | 5µs | if (ref $group_arg) { | ||
| 84 | my $prefix = (delete $merge->{-prefix}||'') . ($group_arg->{-prefix}||''); | ||||
| 85 | my $suffix = ($group_arg->{-suffix}||'') . (delete $merge->{-suffix}||''); | ||||
| 86 | $merge = { | ||||
| 87 | %$merge, | ||||
| 88 | %$group_arg, | ||||
| 89 | ($prefix ? (-prefix => $prefix) : ()), | ||||
| 90 | ($suffix ? (-suffix => $suffix) : ()), | ||||
| 91 | }; | ||||
| 92 | } | ||||
| 93 | |||||
| 94 | 58 | 19µs | my $exports = $config->{groups}{$group_name}; | ||
| 95 | |||||
| 96 | 58 | 208µs | 116 | 66µs | if ( # spent 42µs making 58 calls to Params::Util::_CODELIKE, avg 726ns/call
# spent 23µs making 58 calls to Params::Util::_SCALAR0, avg 403ns/call |
| 97 | Params::Util::_CODELIKE($exports) ## no critic Private | ||||
| 98 | or | ||||
| 99 | Params::Util::_SCALAR0($exports) ## no critic Private | ||||
| 100 | ) { | ||||
| 101 | # I'm not very happy with this code for hiding -prefix and -suffix, but | ||||
| 102 | # it's needed, and I'm not sure, offhand, how to make it better. | ||||
| 103 | # -- rjbs, 2006-12-05 | ||||
| 104 | my $group_arg = $merge ? { %$merge } : {}; | ||||
| 105 | delete $group_arg->{-prefix}; | ||||
| 106 | delete $group_arg->{-suffix}; | ||||
| 107 | |||||
| 108 | my $group = Params::Util::_CODELIKE($exports) ## no critic Private | ||||
| 109 | ? $exports->($class, $group_name, $group_arg, $collection) | ||||
| 110 | : $class->$$exports($group_name, $group_arg, $collection); | ||||
| 111 | |||||
| 112 | Carp::croak qq(group generator "$group_name" did not return a hashref) | ||||
| 113 | if ref $group ne 'HASH'; | ||||
| 114 | |||||
| 115 | my $stuff = [ map { [ $_ => $group->{$_} ] } keys %$group ]; | ||||
| 116 | return @{ | ||||
| 117 | _expand_groups($class, $config, $stuff, $collection, $seen, $merge) | ||||
| 118 | }; | ||||
| 119 | } else { | ||||
| 120 | 58 | 49µs | 58 | 2.22ms | $exports # spent 2.22ms making 58 calls to Data::OptList::mkopt, avg 38µs/call |
| 121 | = Data::OptList::mkopt($exports, "$group_name exports"); | ||||
| 122 | |||||
| 123 | return @{ | ||||
| 124 | 58 | 183µs | 58 | 0s | _expand_groups($class, $config, $exports, $collection, $seen, $merge) # spent 5.25ms making 58 calls to Sub::Exporter::_expand_groups, avg 91µs/call, recursion: max depth 2, sum of overlapping time 5.25ms |
| 125 | }; | ||||
| 126 | } | ||||
| 127 | } | ||||
| 128 | |||||
| 129 | # spent 175µs within Sub::Exporter::_mk_collection_builder which was called 38 times, avg 5µs/call:
# 38 times (175µs+0s) by Sub::Exporter::_collect_collections at line 175, avg 5µs/call | ||||
| 130 | 38 | 8µs | my ($col, $etc) = @_; | ||
| 131 | 38 | 17µs | my ($config, $import_args, $class, $into) = @$etc; | ||
| 132 | |||||
| 133 | 38 | 1µs | my %seen; | ||
| 134 | # spent 20µs (13+6) within Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:159] which was called:
# once (13µs+6µs) by Sub::Exporter::_collect_collections at line 177 | ||||
| 135 | 1 | 200ns | my ($collection) = @_; | ||
| 136 | 1 | 400ns | my ($name, $value) = @$collection; | ||
| 137 | |||||
| 138 | 1 | 600ns | Carp::croak "collection $name provided multiple times in import" | ||
| 139 | if $seen{ $name }++; | ||||
| 140 | |||||
| 141 | 1 | 700ns | if (ref(my $hook = $config->{collectors}{$name})) { | ||
| 142 | 1 | 2µs | my $arg = { | ||
| 143 | name => $name, | ||||
| 144 | config => $config, | ||||
| 145 | import_args => $import_args, | ||||
| 146 | class => $class, | ||||
| 147 | into => $into, | ||||
| 148 | }; | ||||
| 149 | |||||
| 150 | 1 | 1µs | my $error_msg = "collection $name failed validation"; | ||
| 151 | 1 | 4µs | 1 | 600ns | if (Params::Util::_SCALAR0($hook)) { ## no critic Private # spent 600ns making 1 call to Params::Util::_SCALAR0 |
| 152 | Carp::croak $error_msg unless $class->$$hook($value, $arg); | ||||
| 153 | } else { | ||||
| 154 | 1 | 1µs | 1 | 6µs | Carp::croak $error_msg unless $hook->($value, $arg); # spent 6µs making 1 call to Sub::Exporter::_setup |
| 155 | } | ||||
| 156 | } | ||||
| 157 | |||||
| 158 | 1 | 3µs | $col->{ $name } = $value; | ||
| 159 | } | ||||
| 160 | 38 | 163µs | } | ||
| 161 | |||||
| 162 | # Given a config and pre-canonicalized importer args, remove collections from | ||||
| 163 | # the args and return them. | ||||
| 164 | # spent 648µs (453+195) within Sub::Exporter::_collect_collections which was called 38 times, avg 17µs/call:
# 38 times (453µs+195µs) by Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:337] at line 321, avg 17µs/call | ||||
| 165 | 38 | 14µs | my ($config, $import_args, $class, $into) = @_; | ||
| 166 | |||||
| 167 | my @collections | ||||
| 168 | = map { splice @$import_args, $_, 1 } | ||||
| 169 | 38 | 89µs | grep { exists $config->{collectors}{ $import_args->[$_][0] } } | ||
| 170 | reverse 0 .. $#$import_args; | ||||
| 171 | |||||
| 172 | 38 | 10µs | unshift @collections, [ INIT => {} ] if $config->{collectors}{INIT}; | ||
| 173 | |||||
| 174 | 38 | 10µs | my $col = {}; | ||
| 175 | 38 | 43µs | 38 | 175µs | my $builder = _mk_collection_builder($col, \@_); # spent 175µs making 38 calls to Sub::Exporter::_mk_collection_builder, avg 5µs/call |
| 176 | 38 | 17µs | for my $collection (@collections) { | ||
| 177 | 1 | 2µs | 1 | 20µs | $builder->($collection) # spent 20µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:159] |
| 178 | } | ||||
| 179 | |||||
| 180 | 38 | 237µs | return $col; | ||
| 181 | } | ||||
| 182 | |||||
| 183 | |||||
| 184 | # spent 499µs (20+479) within Sub::Exporter::setup_exporter which was called 2 times, avg 250µs/call:
# once (10µs+242µs) by Moose::Meta::Class::BEGIN@28 at line 40 of Moose/Util.pm
# once (10µs+237µs) by Moose::Exporter::BEGIN@17 at line 461 | ||||
| 185 | 2 | 700ns | my ($config) = @_; | ||
| 186 | |||||
| 187 | 2 | 800ns | Carp::croak 'into and into_level may not both be supplied to exporter' | ||
| 188 | if exists $config->{into} and exists $config->{into_level}; | ||||
| 189 | |||||
| 190 | 2 | 1µs | my $as = delete $config->{as} || 'import'; | ||
| 191 | 2 | 2µs | my $into | ||
| 192 | = exists $config->{into} ? delete $config->{into} | ||||
| 193 | : exists $config->{into_level} ? caller(delete $config->{into_level}) | ||||
| 194 | : caller(0); | ||||
| 195 | |||||
| 196 | 2 | 2µs | 2 | 396µs | my $import = build_exporter($config); # spent 396µs making 2 calls to Sub::Exporter::build_exporter, avg 198µs/call |
| 197 | |||||
| 198 | 2 | 11µs | 2 | 83µs | Sub::Install::reinstall_sub({ # spent 83µs making 2 calls to Sub::Install::__ANON__[Sub/Install.pm:132], avg 41µs/call |
| 199 | code => $import, | ||||
| 200 | into => $into, | ||||
| 201 | as => $as, | ||||
| 202 | }); | ||||
| 203 | } | ||||
| 204 | |||||
| 205 | |||||
| 206 | # spent 46µs within Sub::Exporter::_key_intersection which was called 6 times, avg 8µs/call:
# 6 times (46µs+0s) by Sub::Exporter::_rewrite_build_config at line 262, avg 8µs/call | ||||
| 207 | 6 | 2µs | my ($x, $y) = @_; | ||
| 208 | 6 | 31µs | my %seen = map { $_ => 1 } keys %$x; | ||
| 209 | 6 | 18µs | my @names = grep { $seen{$_} } keys %$y; | ||
| 210 | } | ||||
| 211 | |||||
| 212 | # Given the config passed to setup_exporter, which contains sugary opt list | ||||
| 213 | # data, rewrite the opt lists into hashes, catch a few kinds of invalid | ||||
| 214 | # configurations, and set up defaults. Since the config is a reference, it's | ||||
| 215 | # rewritten in place. | ||||
| 216 | 1 | 100ns | my %valid_config_key; | ||
| 217 | # spent 9µs within Sub::Exporter::BEGIN@217 which was called:
# once (9µs+0s) by Moose::Exporter::BEGIN@17 at line 222 | ||||
| 218 | %valid_config_key = | ||||
| 219 | 1 | 10µs | map { $_ => 1 } | ||
| 220 | qw(as collectors installer generator exports groups into into_level), | ||||
| 221 | qw(exporter), # deprecated | ||||
| 222 | 1 | 930µs | 1 | 9µs | } # spent 9µs making 1 call to Sub::Exporter::BEGIN@217 |
| 223 | |||||
| 224 | # spent 23µs (21+1) within Sub::Exporter::_assert_collector_names_ok which was called 6 times, avg 4µs/call:
# 6 times (21µs+1µs) by Sub::Exporter::_rewrite_build_config at line 260, avg 4µs/call | ||||
| 225 | 6 | 1µs | my ($collectors) = @_; | ||
| 226 | |||||
| 227 | 7 | 24µs | 1 | 2µs | for my $reserved_name (grep { /\A[_A-Z]+\z/ } keys %$collectors) { # spent 2µs making 1 call to Sub::Exporter::CORE:match |
| 228 | Carp::croak "unknown reserved collector name: $reserved_name" | ||||
| 229 | if $reserved_name ne 'INIT'; | ||||
| 230 | } | ||||
| 231 | } | ||||
| 232 | |||||
| 233 | # spent 1.59ms (168µs+1.42) within Sub::Exporter::_rewrite_build_config which was called 6 times, avg 265µs/call:
# 6 times (168µs+1.42ms) by Sub::Exporter::build_exporter at line 290, avg 265µs/call | ||||
| 234 | 6 | 1µs | my ($config) = @_; | ||
| 235 | |||||
| 236 | 6 | 16µs | if (my @keys = grep { not exists $valid_config_key{$_} } keys %$config) { | ||
| 237 | Carp::croak "unknown options (@keys) passed to Sub::Exporter"; | ||||
| 238 | } | ||||
| 239 | |||||
| 240 | 6 | 2µs | Carp::croak q(into and into_level may not both be supplied to exporter) | ||
| 241 | if exists $config->{into} and exists $config->{into_level}; | ||||
| 242 | |||||
| 243 | # XXX: Remove after deprecation period. | ||||
| 244 | 6 | 2µs | if ($config->{exporter}) { | ||
| 245 | Carp::cluck "'exporter' argument to build_exporter is deprecated. Use 'installer' instead; the semantics are identical."; | ||||
| 246 | $config->{installer} = delete $config->{exporter}; | ||||
| 247 | } | ||||
| 248 | |||||
| 249 | 6 | 2µs | Carp::croak q(into and into_level may not both be supplied to exporter) | ||
| 250 | if exists $config->{into} and exists $config->{into_level}; | ||||
| 251 | |||||
| 252 | 6 | 4µs | for (qw(exports collectors)) { | ||
| 253 | 12 | 38µs | 12 | 1.15ms | $config->{$_} = Data::OptList::mkopt_hash( # spent 1.15ms making 12 calls to Data::OptList::mkopt_hash, avg 96µs/call |
| 254 | $config->{$_}, | ||||
| 255 | $_, | ||||
| 256 | [ 'CODE', 'SCALAR' ], | ||||
| 257 | ); | ||||
| 258 | } | ||||
| 259 | |||||
| 260 | 6 | 9µs | 6 | 23µs | _assert_collector_names_ok($config->{collectors}); # spent 23µs making 6 calls to Sub::Exporter::_assert_collector_names_ok, avg 4µs/call |
| 261 | |||||
| 262 | 6 | 11µs | 6 | 46µs | if (my @names = _key_intersection(@$config{qw(exports collectors)})) { # spent 46µs making 6 calls to Sub::Exporter::_key_intersection, avg 8µs/call |
| 263 | Carp::croak "names (@names) used in both collections and exports"; | ||||
| 264 | } | ||||
| 265 | |||||
| 266 | 6 | 17µs | 6 | 206µs | $config->{groups} = Data::OptList::mkopt_hash( # spent 206µs making 6 calls to Data::OptList::mkopt_hash, avg 34µs/call |
| 267 | $config->{groups}, | ||||
| 268 | 'groups', | ||||
| 269 | [ | ||||
| 270 | 'HASH', # standard opt list | ||||
| 271 | 'ARRAY', # standard opt list | ||||
| 272 | 'CODE', # group generator | ||||
| 273 | 'SCALAR', # name of group generation method | ||||
| 274 | ] | ||||
| 275 | ); | ||||
| 276 | |||||
| 277 | # by default, export nothing | ||||
| 278 | 6 | 4µs | $config->{groups}{default} ||= []; | ||
| 279 | |||||
| 280 | # by default, build an all-inclusive 'all' group | ||||
| 281 | 6 | 10µs | $config->{groups}{all} ||= [ keys %{ $config->{exports} } ]; | ||
| 282 | |||||
| 283 | 6 | 4µs | $config->{generator} ||= \&default_generator; | ||
| 284 | 6 | 13µs | $config->{installer} ||= \&default_installer; | ||
| 285 | } | ||||
| 286 | |||||
| 287 | # spent 1.63ms (37µs+1.59) within Sub::Exporter::build_exporter which was called 6 times, avg 271µs/call:
# 3 times (20µs+1.13ms) by Moose::Exporter::_make_exporter at line 139 of Moose/Exporter.pm, avg 384µs/call
# 2 times (12µs+384µs) by Sub::Exporter::setup_exporter at line 196, avg 198µs/call
# once (5µs+73µs) by Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:460] at line 460 | ||||
| 288 | 6 | 1µs | my ($config) = @_; | ||
| 289 | |||||
| 290 | 6 | 6µs | 6 | 1.59ms | _rewrite_build_config($config); # spent 1.59ms making 6 calls to Sub::Exporter::_rewrite_build_config, avg 265µs/call |
| 291 | |||||
| 292 | # spent 31.4ms (710µs+30.7) within Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:337] which was called 38 times, avg 826µs/call:
# 26 times (485µs+29.5ms) by Moose::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/darwin-thread-multi-2level/Moose/Exporter.pm:519] at line 518 of Moose/Exporter.pm, avg 1.15ms/call
# once (16µs+216µs) by String::RewritePrefix::BEGIN@11 at line 13 of String/RewritePrefix.pm
# once (21µs+133µs) by Moose::Meta::TypeConstraint::DuckType::BEGIN@16 at line 16 of Moose/Meta/TypeConstraint/DuckType.pm
# once (16µs+113µs) by Moose::Meta::Role::BEGIN@24 at line 24 of Moose/Meta/Role.pm
# once (17µs+99µs) by Moose::Meta::Role::Application::ToClass::BEGIN@14 at line 14 of Moose/Meta/Role/Application/ToClass.pm
# once (24µs+91µs) by Moose::Meta::Role::Method::Conflicting::BEGIN@13 at line 13 of Moose/Meta/Role/Method/Conflicting.pm
# once (22µs+87µs) by Moose::Util::BEGIN@15 at line 15 of Moose/Util.pm
# once (20µs+87µs) by Moose::Exporter::BEGIN@17 at line 17 of Moose/Exporter.pm
# once (18µs+72µs) by MooseX::Storage::Basic::BEGIN@11 at line 11 of MooseX/Storage/Basic.pm
# once (18µs+70µs) by Moose::Role::BEGIN@15 at line 15 of Moose/Role.pm
# once (18µs+68µs) by Moose::Meta::Method::Accessor::Native::Writer::BEGIN@13 at line 13 of Moose/Meta/Method/Accessor/Native/Writer.pm
# once (17µs+66µs) by Moose::Meta::Class::BEGIN@28 at line 28 of Moose/Meta/Class.pm
# once (17µs+65µs) by Moose::Meta::Attribute::Native::Trait::BEGIN@14 at line 14 of Moose/Meta/Attribute/Native/Trait.pm | ||||
| 293 | 38 | 13µs | my ($class) = shift; | ||
| 294 | |||||
| 295 | # XXX: clean this up -- rjbs, 2006-03-16 | ||||
| 296 | 38 | 18µs | my $special = (ref $_[0]) ? shift(@_) : {}; | ||
| 297 | 38 | 10µs | Carp::croak q(into and into_level may not both be supplied to exporter) | ||
| 298 | if exists $special->{into} and exists $special->{into_level}; | ||||
| 299 | |||||
| 300 | 38 | 7µs | if ($special->{exporter}) { | ||
| 301 | Carp::cluck "'exporter' special import argument is deprecated. Use 'installer' instead; the semantics are identical."; | ||||
| 302 | $special->{installer} = delete $special->{exporter}; | ||||
| 303 | } | ||||
| 304 | |||||
| 305 | 38 | 48µs | my $into | ||
| 306 | = defined $special->{into} ? delete $special->{into} | ||||
| 307 | : defined $special->{into_level} ? caller(delete $special->{into_level}) | ||||
| 308 | : defined $config->{into} ? $config->{into} | ||||
| 309 | : defined $config->{into_level} ? caller($config->{into_level}) | ||||
| 310 | : caller(0); | ||||
| 311 | |||||
| 312 | 38 | 18µs | my $generator = delete $special->{generator} || $config->{generator}; | ||
| 313 | 38 | 11µs | my $installer = delete $special->{installer} || $config->{installer}; | ||
| 314 | |||||
| 315 | # this builds a AOA, where the inner arrays are [ name => value_ref ] | ||||
| 316 | 38 | 50µs | 38 | 304µs | my $import_args = Data::OptList::mkopt([ @_ ]); # spent 304µs making 38 calls to Data::OptList::mkopt, avg 8µs/call |
| 317 | |||||
| 318 | # is this right? defaults first or collectors first? -- rjbs, 2006-06-24 | ||||
| 319 | 38 | 43µs | $import_args = [ [ -default => undef ] ] unless @$import_args; | ||
| 320 | |||||
| 321 | 38 | 41µs | 38 | 648µs | my $collection = _collect_collections($config, $import_args, $class, $into); # spent 648µs making 38 calls to Sub::Exporter::_collect_collections, avg 17µs/call |
| 322 | |||||
| 323 | 38 | 36µs | 38 | 5.27ms | my $to_import = _expand_groups($class, $config, $import_args, $collection); # spent 5.27ms making 38 calls to Sub::Exporter::_expand_groups, avg 139µs/call |
| 324 | |||||
| 325 | # now, finally $import_arg is really the "to do" list | ||||
| 326 | 38 | 249µs | 38 | 24.5ms | _do_import( # spent 24.5ms making 38 calls to Sub::Exporter::_do_import, avg 644µs/call |
| 327 | { | ||||
| 328 | class => $class, | ||||
| 329 | col => $collection, | ||||
| 330 | config => $config, | ||||
| 331 | into => $into, | ||||
| 332 | generator => $generator, | ||||
| 333 | installer => $installer, | ||||
| 334 | }, | ||||
| 335 | $to_import, | ||||
| 336 | ); | ||||
| 337 | 6 | 16µs | }; | ||
| 338 | |||||
| 339 | 6 | 13µs | return $import; | ||
| 340 | } | ||||
| 341 | |||||
| 342 | # spent 24.5ms (2.42+22.0) within Sub::Exporter::_do_import which was called 38 times, avg 644µs/call:
# 38 times (2.42ms+22.0ms) by Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:337] at line 326, avg 644µs/call | ||||
| 343 | 38 | 8µs | my ($arg, $to_import) = @_; | ||
| 344 | |||||
| 345 | 38 | 4µs | my @todo; | ||
| 346 | |||||
| 347 | 38 | 21µs | for my $pair (@$to_import) { | ||
| 348 | 364 | 80µs | my ($name, $import_arg) = @$pair; | ||
| 349 | |||||
| 350 | 364 | 2µs | my ($generator, $as); | ||
| 351 | |||||
| 352 | 364 | 45µs | 1 | 500ns | if ($import_arg and Params::Util::_CODELIKE($import_arg)) { ## no critic # spent 500ns making 1 call to Params::Util::_CODELIKE |
| 353 | # This is the case when a group generator has inserted name/code pairs. | ||||
| 354 | $generator = sub { $import_arg }; | ||||
| 355 | $as = $name; | ||||
| 356 | } else { | ||||
| 357 | 364 | 79µs | $import_arg = { $import_arg ? %$import_arg : () }; | ||
| 358 | |||||
| 359 | 364 | 106µs | Carp::croak qq("$name" is not exported by the $arg->{class} module) | ||
| 360 | unless exists $arg->{config}{exports}{$name}; | ||||
| 361 | |||||
| 362 | 364 | 90µs | $generator = $arg->{config}{exports}{$name}; | ||
| 363 | |||||
| 364 | 364 | 112µs | $as = exists $import_arg->{-as} ? (delete $import_arg->{-as}) : $name; | ||
| 365 | } | ||||
| 366 | |||||
| 367 | 364 | 721µs | 364 | 4.07ms | my $code = $arg->{generator}->( # spent 4.07ms making 364 calls to Sub::Exporter::default_generator, avg 11µs/call |
| 368 | { | ||||
| 369 | class => $arg->{class}, | ||||
| 370 | name => $name, | ||||
| 371 | arg => $import_arg, | ||||
| 372 | col => $arg->{col}, | ||||
| 373 | generator => $generator, | ||||
| 374 | } | ||||
| 375 | ); | ||||
| 376 | |||||
| 377 | 364 | 305µs | push @todo, $as, $code; | ||
| 378 | } | ||||
| 379 | |||||
| 380 | 38 | 133µs | 38 | 16.9ms | $arg->{installer}->( # spent 16.7ms making 26 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:137], avg 644µs/call
# spent 201µs making 12 calls to Sub::Exporter::default_installer, avg 17µs/call |
| 381 | { | ||||
| 382 | class => $arg->{class}, | ||||
| 383 | into => $arg->{into}, | ||||
| 384 | col => $arg->{col}, | ||||
| 385 | }, | ||||
| 386 | \@todo, | ||||
| 387 | ); | ||||
| 388 | } | ||||
| 389 | |||||
| 390 | ## Cute idea, possibly for future use: also supply an "unimport" for: | ||||
| 391 | ## no Module::Whatever qw(arg arg arg); | ||||
| 392 | # sub _unexport { | ||||
| 393 | # my (undef, undef, undef, undef, undef, $as, $into) = @_; | ||||
| 394 | # | ||||
| 395 | # if (ref $as eq 'SCALAR') { | ||||
| 396 | # undef $$as; | ||||
| 397 | # } elsif (ref $as) { | ||||
| 398 | # Carp::croak "invalid reference type for $as: " . ref $as; | ||||
| 399 | # } else { | ||||
| 400 | # no strict 'refs'; | ||||
| 401 | # delete &{$into . '::' . $as}; | ||||
| 402 | # } | ||||
| 403 | # } | ||||
| 404 | |||||
| 405 | |||||
| 406 | # spent 4.07ms (1.74+2.33) within Sub::Exporter::default_generator which was called 364 times, avg 11µs/call:
# 364 times (1.74ms+2.33ms) by Sub::Exporter::_do_import at line 367, avg 11µs/call | ||||
| 407 | 364 | 38µs | my ($arg) = @_; | ||
| 408 | 364 | 160µs | my ($class, $name, $generator) = @$arg{qw(class name generator)}; | ||
| 409 | |||||
| 410 | 364 | 33µs | if (not defined $generator) { | ||
| 411 | 3 | 14µs | 3 | 4µs | my $code = $class->can($name) # spent 4µs making 3 calls to UNIVERSAL::can, avg 1µs/call |
| 412 | or Carp::croak "can't locate exported subroutine $name via $class"; | ||||
| 413 | 3 | 6µs | return $code; | ||
| 414 | } | ||||
| 415 | |||||
| 416 | # I considered making this "$class->$generator(" but it seems that | ||||
| 417 | # overloading precedence would turn an overloaded-as-code generator object | ||||
| 418 | # into a string before code. -- rjbs, 2006-06-11 | ||||
| 419 | 361 | 1.32ms | 722 | 2.33ms | return $generator->($class, $name, $arg->{arg}, $arg->{col}) # spent 1.97ms making 176 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:379], avg 11µs/call
# spent 149µs making 184 calls to Moose::Exporter::__ANON__[Moose/Exporter.pm:307], avg 808ns/call
# spent 124µs making 361 calls to Params::Util::_CODELIKE, avg 343ns/call
# spent 83µs making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:460] |
| 420 | if Params::Util::_CODELIKE($generator); ## no critic Private | ||||
| 421 | |||||
| 422 | # This "must" be a scalar reference, to a generator method name. | ||||
| 423 | # -- rjbs, 2006-12-05 | ||||
| 424 | return $class->$$generator($name, $arg->{arg}, $arg->{col}); | ||||
| 425 | } | ||||
| 426 | |||||
| 427 | |||||
| 428 | # spent 14.1ms (1.61+12.5) within Sub::Exporter::default_installer which was called 38 times, avg 370µs/call:
# 24 times (1.40ms+11.4ms) by Moose::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/darwin-thread-multi-2level/Moose/Exporter.pm:137] at line 129 of Moose/Exporter.pm, avg 534µs/call
# 12 times (48µs+153µs) by Sub::Exporter::_do_import at line 380, avg 17µs/call
# 2 times (160µs+878µs) by Sub::Exporter::_do_import at line 110 of Moose/Exporter.pm, avg 519µs/call | ||||
| 429 | 38 | 7µs | my ($arg, $to_export) = @_; | ||
| 430 | |||||
| 431 | 38 | 322µs | for (my $i = 0; $i < @$to_export; $i += 2) { | ||
| 432 | 362 | 150µs | my ($as, $code) = @$to_export[ $i, $i+1 ]; | ||
| 433 | |||||
| 434 | # Allow as isa ARRAY to push onto an array? | ||||
| 435 | # Allow into isa HASH to install name=>code into hash? | ||||
| 436 | |||||
| 437 | 362 | 111µs | if (ref $as eq 'SCALAR') { | ||
| 438 | $$as = $code; | ||||
| 439 | } elsif (ref $as) { | ||||
| 440 | Carp::croak "invalid reference type for $as: " . ref $as; | ||||
| 441 | } else { | ||||
| 442 | 362 | 557µs | 362 | 12.5ms | Sub::Install::reinstall_sub({ # spent 12.5ms making 362 calls to Sub::Install::__ANON__[Sub/Install.pm:132], avg 34µs/call |
| 443 | code => $code, | ||||
| 444 | into => $arg->{into}, | ||||
| 445 | as => $as | ||||
| 446 | }); | ||||
| 447 | } | ||||
| 448 | } | ||||
| 449 | } | ||||
| 450 | |||||
| 451 | sub default_exporter { | ||||
| 452 | Carp::cluck "default_exporter is deprecated; call default_installer instead; the semantics are identical"; | ||||
| 453 | goto &default_installer; | ||||
| 454 | } | ||||
| 455 | |||||
| 456 | |||||
| 457 | setup_exporter({ | ||||
| 458 | exports => [ | ||||
| 459 | qw(setup_exporter build_exporter), | ||||
| 460 | 1 | 3µs | 1 | 78µs | # spent 83µs (4+78) within Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:460] which was called:
# once (4µs+78µs) by Sub::Exporter::default_generator at line 419 # spent 78µs making 1 call to Sub::Exporter::build_exporter |
| 461 | 1 | 8µs | 1 | 247µs | ], # spent 247µs making 1 call to Sub::Exporter::setup_exporter |
| 462 | groups => { | ||||
| 463 | all => [ qw(setup_exporter build_export) ], | ||||
| 464 | }, | ||||
| 465 | collectors => { -setup => \&_setup }, | ||||
| 466 | }); | ||||
| 467 | |||||
| 468 | # spent 6µs within Sub::Exporter::_setup which was called:
# once (6µs+0s) by Sub::Exporter::__ANON__[/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/Sub/Exporter.pm:159] at line 154 | ||||
| 469 | 1 | 300ns | my ($value, $arg) = @_; | ||
| 470 | |||||
| 471 | 1 | 700ns | if (ref $value eq 'HASH') { | ||
| 472 | 1 | 3µs | push @{ $arg->{import_args} }, [ _import => { -as => 'import', %$value } ]; | ||
| 473 | 1 | 3µs | return 1; | ||
| 474 | } elsif (ref $value eq 'ARRAY') { | ||||
| 475 | push @{ $arg->{import_args} }, | ||||
| 476 | [ _import => { -as => 'import', exports => $value } ]; | ||||
| 477 | return 1; | ||||
| 478 | } | ||||
| 479 | return; | ||||
| 480 | } | ||||
| 481 | |||||
| - - | |||||
| 484 | 1 | 6µs | "jn8:32"; # <-- magic true value | ||
| 485 | |||||
| 486 | __END__ | ||||
# spent 2µs within Sub::Exporter::CORE:match which was called:
# once (2µs+0s) by Sub::Exporter::_assert_collector_names_ok at line 227 |