| File | /usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm |
| Statements Executed | 659 |
| Statement Execution Time | 3.95ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 37 | 1 | 1 | 579µs | 752µs | Sub::Install::__ANON__[:175] |
| 37 | 2 | 1 | 526µs | 1.45ms | Sub::Install::__ANON__[:132] |
| 37 | 1 | 1 | 173µs | 173µs | Sub::Install::__ANON__[:187] |
| 37 | 1 | 1 | 135µs | 171µs | Sub::Install::_CODELIKE |
| 1 | 1 | 1 | 61µs | 130µs | Sub::Install::BEGIN@190 |
| 1 | 1 | 1 | 30µs | 56µs | Sub::Install::BEGIN@3 |
| 3 | 3 | 2 | 29µs | 29µs | Sub::Install::CORE:qr (opcode) |
| 2 | 2 | 2 | 24µs | 24µs | Sub::Install::exporter |
| 3 | 3 | 1 | 23µs | 27µs | Sub::Install::_do_with_warn |
| 1 | 1 | 1 | 18µs | 45µs | Sub::Install::BEGIN@139 |
| 2 | 2 | 1 | 18µs | 18µs | Sub::Install::_build_public_installer |
| 3 | 3 | 1 | 17µs | 17µs | Sub::Install::__ANON__[:176] |
| 1 | 1 | 1 | 16µs | 28µs | Sub::Install::BEGIN@287 |
| 1 | 1 | 1 | 12µs | 82µs | Sub::Install::BEGIN@6 |
| 1 | 1 | 1 | 12µs | 37µs | Sub::Install::BEGIN@184 |
| 1 | 1 | 1 | 11µs | 15µs | Sub::Install::BEGIN@4 |
| 3 | 3 | 1 | 10µs | 10µs | Sub::Install::_installer |
| 1 | 1 | 1 | 9µs | 12µs | Sub::Install::BEGIN@148 |
| 1 | 1 | 1 | 6µs | 6µs | Sub::Install::__ANON__[:284] |
| 1 | 1 | 1 | 5µs | 5µs | Sub::Install::BEGIN@7 |
| 0 | 0 | 0 | 0s | 0s | Sub::Install::__ANON__[:156] |
| 0 | 0 | 0 | 0s | 0s | Sub::Install::__ANON__[:173] |
| 0 | 0 | 0 | 0s | 0s | Sub::Install::__ANON__[:250] |
| 0 | 0 | 0 | 0s | 0s | Sub::Install::_name_of_code |
| 0 | 0 | 0 | 0s | 0s | Sub::Install::install_installers |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Sub::Install; | ||||
| 2 | |||||
| 3 | 3 | 40µs | 2 | 82µs | # spent 56µs (30+26) within Sub::Install::BEGIN@3 which was called
# once (30µs+26µs) by Data::OptList::BEGIN@8 at line 3 # spent 56µs making 1 call to Sub::Install::BEGIN@3
# spent 26µs making 1 call to warnings::import |
| 4 | 3 | 31µs | 2 | 19µs | # spent 15µs (11+4) within Sub::Install::BEGIN@4 which was called
# once (11µs+4µs) by Data::OptList::BEGIN@8 at line 4 # spent 15µs making 1 call to Sub::Install::BEGIN@4
# spent 4µs making 1 call to strict::import |
| 5 | |||||
| 6 | 3 | 34µs | 2 | 153µs | # spent 82µs (12+70) within Sub::Install::BEGIN@6 which was called
# once (12µs+70µs) by Data::OptList::BEGIN@8 at line 6 # spent 82µs making 1 call to Sub::Install::BEGIN@6
# spent 70µs making 1 call to Exporter::import |
| 7 | 3 | 520µs | 1 | 5µs | # spent 5µs within Sub::Install::BEGIN@7 which was called
# once (5µs+0s) by Data::OptList::BEGIN@8 at line 7 # spent 5µs making 1 call to Sub::Install::BEGIN@7 |
| 8 | |||||
| 9 | =head1 NAME | ||||
| 10 | |||||
| 11 | Sub::Install - install subroutines into packages easily | ||||
| 12 | |||||
| 13 | =head1 VERSION | ||||
| 14 | |||||
| 15 | version 0.925 | ||||
| 16 | |||||
| 17 | =cut | ||||
| 18 | |||||
| 19 | 1 | 3µs | our $VERSION = '0.925'; | ||
| 20 | |||||
| 21 | =head1 SYNOPSIS | ||||
| 22 | |||||
| 23 | use Sub::Install; | ||||
| 24 | |||||
| 25 | Sub::Install::install_sub({ | ||||
| 26 | code => sub { ... }, | ||||
| 27 | into => $package, | ||||
| 28 | as => $subname | ||||
| 29 | }); | ||||
| 30 | |||||
| 31 | =head1 DESCRIPTION | ||||
| 32 | |||||
| 33 | This module makes it easy to install subroutines into packages without the | ||||
| 34 | unslightly mess of C<no strict> or typeglobs lying about where just anyone can | ||||
| 35 | see them. | ||||
| 36 | |||||
| 37 | =head1 FUNCTIONS | ||||
| 38 | |||||
| 39 | =head2 install_sub | ||||
| 40 | |||||
| 41 | Sub::Install::install_sub({ | ||||
| 42 | code => \&subroutine, | ||||
| 43 | into => "Finance::Shady", | ||||
| 44 | as => 'launder', | ||||
| 45 | }); | ||||
| 46 | |||||
| 47 | This routine installs a given code reference into a package as a normal | ||||
| 48 | subroutine. The above is equivalent to: | ||||
| 49 | |||||
| 50 | no strict 'refs'; | ||||
| 51 | *{"Finance::Shady" . '::' . "launder"} = \&subroutine; | ||||
| 52 | |||||
| 53 | If C<into> is not given, the sub is installed into the calling package. | ||||
| 54 | |||||
| 55 | If C<code> is not a code reference, it is looked for as an existing sub in the | ||||
| 56 | package named in the C<from> parameter. If C<from> is not given, it will look | ||||
| 57 | in the calling package. | ||||
| 58 | |||||
| 59 | If C<as> is not given, and if C<code> is a name, C<as> will default to C<code>. | ||||
| 60 | If C<as> is not given, but if C<code> is a code ref, Sub::Install will try to | ||||
| 61 | find the name of the given code ref and use that as C<as>. | ||||
| 62 | |||||
| 63 | That means that this code: | ||||
| 64 | |||||
| 65 | Sub::Install::install_sub({ | ||||
| 66 | code => 'twitch', | ||||
| 67 | from => 'Person::InPain', | ||||
| 68 | into => 'Person::Teenager', | ||||
| 69 | as => 'dance', | ||||
| 70 | }); | ||||
| 71 | |||||
| 72 | is the same as: | ||||
| 73 | |||||
| 74 | package Person::Teenager; | ||||
| 75 | |||||
| 76 | Sub::Install::install_sub({ | ||||
| 77 | code => Person::InPain->can('twitch'), | ||||
| 78 | as => 'dance', | ||||
| 79 | }); | ||||
| 80 | |||||
| 81 | =head2 reinstall_sub | ||||
| 82 | |||||
| 83 | This routine behaves exactly like C<L</install_sub>>, but does not emit a | ||||
| 84 | warning if warnings are on and the destination is already defined. | ||||
| 85 | |||||
| 86 | =cut | ||||
| 87 | |||||
| 88 | sub _name_of_code { | ||||
| 89 | my ($code) = @_; | ||||
| 90 | require B; | ||||
| 91 | my $name = B::svref_2object($code)->GV->NAME; | ||||
| 92 | return $name unless $name =~ /\A__ANON__/; | ||||
| 93 | return; | ||||
| 94 | } | ||||
| 95 | |||||
| 96 | # See also Params::Util, to which this code was donated. | ||||
| 97 | # spent 171µs (135+35) within Sub::Install::_CODELIKE which was called 37 times, avg 5µs/call:
# 37 times (135µs+35µs) by Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:132] at line 117, avg 5µs/call | ||||
| 98 | 37 | 199µs | 37 | 35µs | (Scalar::Util::reftype($_[0])||'') eq 'CODE' # spent 35µs making 37 calls to Scalar::Util::reftype, avg 957ns/call |
| 99 | || Scalar::Util::blessed($_[0]) | ||||
| 100 | && (overload::Method($_[0],'&{}') ? $_[0] : undef); | ||||
| 101 | } | ||||
| 102 | |||||
| 103 | # do the heavy lifting | ||||
| 104 | sub _build_public_installer { | ||||
| 105 | 4 | 22µs | my ($installer) = @_; | ||
| 106 | |||||
| 107 | # spent 1.45ms (526µs+922µs) within Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:132] which was called 37 times, avg 39µs/call:
# 35 times (475µs+834µs) by Sub::Exporter::default_installer at line 896 of Sub/Exporter.pm, avg 37µs/call
# 2 times (51µs+88µs) by Sub::Exporter::setup_exporter at line 607 of Sub/Exporter.pm, avg 69µs/call | ||||
| 108 | 333 | 416µs | my ($arg) = @_; | ||
| 109 | my ($calling_pkg) = caller(0); | ||||
| 110 | |||||
| 111 | # I'd rather use ||= but I'm whoring for Devel::Cover. | ||||
| 112 | for (qw(into from)) { $arg->{$_} = $calling_pkg unless $arg->{$_} } | ||||
| 113 | |||||
| 114 | # This is the only absolutely required argument, in many cases. | ||||
| 115 | Carp::croak "named argument 'code' is not optional" unless $arg->{code}; | ||||
| 116 | |||||
| 117 | if (_CODELIKE($arg->{code})) { # spent 171µs making 37 calls to Sub::Install::_CODELIKE, avg 5µs/call | ||||
| 118 | $arg->{as} ||= _name_of_code($arg->{code}); | ||||
| 119 | } else { | ||||
| 120 | Carp::croak | ||||
| 121 | "couldn't find subroutine named $arg->{code} in package $arg->{from}" | ||||
| 122 | unless my $code = $arg->{from}->can($arg->{code}); | ||||
| 123 | |||||
| 124 | $arg->{as} = $arg->{code} unless $arg->{as}; | ||||
| 125 | $arg->{code} = $code; | ||||
| 126 | } | ||||
| 127 | |||||
| 128 | Carp::croak "couldn't determine name under which to install subroutine" | ||||
| 129 | unless $arg->{as}; | ||||
| 130 | |||||
| 131 | $installer->(@$arg{qw(into as code) }); # spent 752µs making 37 calls to Sub::Install::__ANON__[Sub/Install.pm:175], avg 20µs/call | ||||
| 132 | } | ||||
| 133 | } | ||||
| 134 | |||||
| 135 | # do the ugly work | ||||
| 136 | |||||
| 137 | 1 | 400ns | my $_misc_warn_re; | ||
| 138 | 1 | 200ns | my $_redef_warn_re; | ||
| 139 | # spent 45µs (18+27) within Sub::Install::BEGIN@139 which was called
# once (18µs+27µs) by Data::OptList::BEGIN@8 at line 145 | ||||
| 140 | 2 | 44µs | 1 | 16µs | $_misc_warn_re = qr/ # spent 16µs making 1 call to Sub::Install::CORE:qr |
| 141 | Prototype\ mismatch:\ sub\ .+? | | ||||
| 142 | Constant subroutine \S+ redefined | ||||
| 143 | /x; | ||||
| 144 | $_redef_warn_re = qr/Subroutine\ \S+\ redefined/x; # spent 10µs making 1 call to Sub::Install::CORE:qr | ||||
| 145 | 1 | 52µs | 1 | 45µs | } # spent 45µs making 1 call to Sub::Install::BEGIN@139 |
| 146 | |||||
| 147 | 1 | 100ns | my $eow_re; | ||
| 148 | 1 | 403µs | 2 | 14µs | # spent 12µs (9+2) within Sub::Install::BEGIN@148 which was called
# once (9µs+2µs) by Data::OptList::BEGIN@8 at line 148 # spent 12µs making 1 call to Sub::Install::BEGIN@148
# spent 2µs making 1 call to Sub::Install::CORE:qr |
| 149 | |||||
| 150 | sub _do_with_warn { | ||||
| 151 | 14 | 35µs | my ($arg) = @_; | ||
| 152 | my $code = delete $arg->{code}; | ||||
| 153 | # spent 17µs within Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:176] which was called 3 times, avg 6µs/call:
# once (9µs+0s) by Sub::Install::BEGIN@190 at line 202
# once (5µs+0s) by Sub::Install::BEGIN@190 at line 195
# once (4µs+0s) by Sub::Install::_do_with_warn at line 177 | ||||
| 154 | 6 | 24µs | my $code = shift; | ||
| 155 | # spent 752µs (579+173) within Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:175] which was called 37 times, avg 20µs/call:
# 37 times (579µs+173µs) by Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:132] at line 131, avg 20µs/call | ||||
| 156 | 111 | 565µs | my $warn = $SIG{__WARN__} ? $SIG{__WARN__} : sub { warn @_ }; ## no critic | ||
| 157 | local $SIG{__WARN__} = sub { | ||||
| 158 | my ($error) = @_; | ||||
| 159 | for (@{ $arg->{suppress} }) { | ||||
| 160 | return if $error =~ $_; | ||||
| 161 | } | ||||
| 162 | for (@{ $arg->{croak} }) { | ||||
| 163 | if (my ($base_error) = $error =~ /\A($_) $eow_re/x) { | ||||
| 164 | Carp::croak $base_error; | ||||
| 165 | } | ||||
| 166 | } | ||||
| 167 | for (@{ $arg->{carp} }) { | ||||
| 168 | if (my ($base_error) = $error =~ /\A($_) $eow_re/x) { | ||||
| 169 | return $warn->(Carp::shortmess $base_error); | ||||
| 170 | } | ||||
| 171 | } | ||||
| 172 | ($arg->{default} || $warn)->($error); | ||||
| 173 | }; | ||||
| 174 | $code->(@_); # spent 173µs making 37 calls to Sub::Install::__ANON__[Sub/Install.pm:187], avg 5µs/call | ||||
| 175 | }; | ||||
| 176 | }; | ||||
| 177 | return $wants_code->($code) if $code; # spent 4µs making 1 call to Sub::Install::__ANON__[Sub/Install.pm:176] | ||||
| 178 | return $wants_code; | ||||
| 179 | } | ||||
| 180 | |||||
| 181 | sub _installer { | ||||
| 182 | # spent 173µs within Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:187] which was called 37 times, avg 5µs/call:
# 37 times (173µs+0s) by Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:175] at line 174, avg 5µs/call | ||||
| 183 | 111 | 210µs | my ($pkg, $name, $code) = @_; | ||
| 184 | 3 | 186µs | 2 | 61µs | # spent 37µs (12+25) within Sub::Install::BEGIN@184 which was called
# once (12µs+25µs) by Data::OptList::BEGIN@8 at line 184 # spent 37µs making 1 call to Sub::Install::BEGIN@184
# spent 25µs making 1 call to strict::unimport |
| 185 | *{"$pkg\::$name"} = $code; | ||||
| 186 | return $code; | ||||
| 187 | } | ||||
| 188 | 3 | 17µs | } | ||
| 189 | |||||
| 190 | # spent 130µs (61+68) within Sub::Install::BEGIN@190 which was called
# once (61µs+68µs) by Data::OptList::BEGIN@8 at line 208 | ||||
| 191 | 5 | 28µs | 1 | 9µs | *_ignore_warnings = _do_with_warn({ # spent 9µs making 1 call to Sub::Install::_do_with_warn |
| 192 | carp => [ $_misc_warn_re, $_redef_warn_re ] | ||||
| 193 | }); | ||||
| 194 | |||||
| 195 | *install_sub = _build_public_installer(_ignore_warnings(_installer)); # spent 12µs making 1 call to Sub::Install::_build_public_installer
# spent 5µs making 1 call to Sub::Install::__ANON__[Sub/Install.pm:176]
# spent 4µs making 1 call to Sub::Install::_installer | ||||
| 196 | |||||
| 197 | *_carp_warnings = _do_with_warn({ # spent 5µs making 1 call to Sub::Install::_do_with_warn | ||||
| 198 | carp => [ $_misc_warn_re ], | ||||
| 199 | suppress => [ $_redef_warn_re ], | ||||
| 200 | }); | ||||
| 201 | |||||
| 202 | *reinstall_sub = _build_public_installer(_carp_warnings(_installer)); # spent 9µs making 1 call to Sub::Install::__ANON__[Sub/Install.pm:176]
# spent 5µs making 1 call to Sub::Install::_build_public_installer
# spent 3µs making 1 call to Sub::Install::_installer | ||||
| 203 | |||||
| 204 | *_install_fatal = _do_with_warn({ # spent 12µs making 1 call to Sub::Install::_do_with_warn
# spent 3µs making 1 call to Sub::Install::_installer | ||||
| 205 | code => _installer, | ||||
| 206 | croak => [ $_redef_warn_re ], | ||||
| 207 | }); | ||||
| 208 | 1 | 362µs | 1 | 130µs | } # spent 130µs making 1 call to Sub::Install::BEGIN@190 |
| 209 | |||||
| 210 | =head2 install_installers | ||||
| 211 | |||||
| 212 | This routine is provided to allow Sub::Install compatibility with | ||||
| 213 | Sub::Installer. It installs C<install_sub> and C<reinstall_sub> methods into | ||||
| 214 | the package named by its argument. | ||||
| 215 | |||||
| 216 | Sub::Install::install_installers('Code::Builder'); # just for us, please | ||||
| 217 | Code::Builder->install_sub({ name => $code_ref }); | ||||
| 218 | |||||
| 219 | Sub::Install::install_installers('UNIVERSAL'); # feeling lucky, punk? | ||||
| 220 | Anything::At::All->install_sub({ name => $code_ref }); | ||||
| 221 | |||||
| 222 | The installed installers are similar, but not identical, to those provided by | ||||
| 223 | Sub::Installer. They accept a single hash as an argument. The key/value pairs | ||||
| 224 | are used as the C<as> and C<code> parameters to the C<install_sub> routine | ||||
| 225 | detailed above. The package name on which the method is called is used as the | ||||
| 226 | C<into> parameter. | ||||
| 227 | |||||
| 228 | Unlike Sub::Installer's C<install_sub> will not eval strings into code, but | ||||
| 229 | will look for named code in the calling package. | ||||
| 230 | |||||
| 231 | =cut | ||||
| 232 | |||||
| 233 | sub install_installers { | ||||
| 234 | my ($into) = @_; | ||||
| 235 | |||||
| 236 | for my $method (qw(install_sub reinstall_sub)) { | ||||
| 237 | my $code = sub { | ||||
| 238 | my ($package, $subs) = @_; | ||||
| 239 | my ($caller) = caller(0); | ||||
| 240 | my $return; | ||||
| 241 | for (my ($name, $sub) = %$subs) { | ||||
| 242 | $return = Sub::Install->can($method)->({ | ||||
| 243 | code => $sub, | ||||
| 244 | from => $caller, | ||||
| 245 | into => $package, | ||||
| 246 | as => $name | ||||
| 247 | }); | ||||
| 248 | } | ||||
| 249 | return $return; | ||||
| 250 | }; | ||||
| 251 | install_sub({ code => $code, into => $into, as => $method }); | ||||
| 252 | } | ||||
| 253 | } | ||||
| 254 | |||||
| 255 | =head1 EXPORTS | ||||
| 256 | |||||
| 257 | Sub::Install exports C<install_sub> and C<reinstall_sub> only if they are | ||||
| 258 | requested. | ||||
| 259 | |||||
| 260 | =head2 exporter | ||||
| 261 | |||||
| 262 | Sub::Install has a never-exported subroutine called C<exporter>, which is used | ||||
| 263 | to implement its C<import> routine. It takes a hashref of named arguments, | ||||
| 264 | only one of which is currently recognize: C<exports>. This must be an arrayref | ||||
| 265 | of subroutines to offer for export. | ||||
| 266 | |||||
| 267 | This routine is mainly for Sub::Install's own consumption. Instead, consider | ||||
| 268 | L<Sub::Exporter>. | ||||
| 269 | |||||
| 270 | =cut | ||||
| 271 | |||||
| 272 | # spent 24µs within Sub::Install::exporter which was called 2 times, avg 12µs/call:
# once (12µs+0s) by Sub::Install::BEGIN@287 at line 287
# once (12µs+0s) by Data::OptList::BEGIN@214 at line 215 of Data/OptList.pm | ||||
| 273 | 6 | 34µs | my ($arg) = @_; | ||
| 274 | |||||
| 275 | my %is_exported = map { $_ => undef } @{ $arg->{exports} }; | ||||
| 276 | |||||
| 277 | # spent 6µs within Sub::Install::__ANON__[/usr/local/lib/perl5/site_perl/5.10.1/Sub/Install.pm:284] which was called
# once (6µs+0s) by Moose::Util::BEGIN@6 at line 6 of Moose/Util.pm | ||||
| 278 | 3 | 6µs | my $class = shift; | ||
| 279 | my $target = caller; | ||||
| 280 | for (@_) { | ||||
| 281 | Carp::croak "'$_' is not exported by $class" if !exists $is_exported{$_}; | ||||
| 282 | install_sub({ code => $_, from => $class, into => $target }); | ||||
| 283 | } | ||||
| 284 | } | ||||
| 285 | } | ||||
| 286 | |||||
| 287 | 1 | 707µs | 2 | 40µs | # spent 28µs (16+12) within Sub::Install::BEGIN@287 which was called
# once (16µs+12µs) by Data::OptList::BEGIN@8 at line 287 # spent 28µs making 1 call to Sub::Install::BEGIN@287
# spent 12µs making 1 call to Sub::Install::exporter |
| 288 | |||||
| 289 | =head1 SEE ALSO | ||||
| 290 | |||||
| 291 | =over | ||||
| 292 | |||||
| 293 | =item L<Sub::Installer> | ||||
| 294 | |||||
| 295 | This module is (obviously) a reaction to Damian Conway's Sub::Installer, which | ||||
| 296 | does the same thing, but does it by getting its greasy fingers all over | ||||
| 297 | UNIVERSAL. I was really happy about the idea of making the installation of | ||||
| 298 | coderefs less ugly, but I couldn't bring myself to replace the ugliness of | ||||
| 299 | typeglobs and loosened strictures with the ugliness of UNIVERSAL methods. | ||||
| 300 | |||||
| 301 | =item L<Sub::Exporter> | ||||
| 302 | |||||
| 303 | This is a complete Exporter.pm replacement, built atop Sub::Install. | ||||
| 304 | |||||
| 305 | =back | ||||
| 306 | |||||
| 307 | =head1 AUTHOR | ||||
| 308 | |||||
| 309 | Ricardo Signes, C<< <rjbs@cpan.org> >> | ||||
| 310 | |||||
| 311 | Several of the tests are adapted from tests that shipped with Damian Conway's | ||||
| 312 | Sub-Installer distribution. | ||||
| 313 | |||||
| 314 | =head1 BUGS | ||||
| 315 | |||||
| 316 | Please report any bugs or feature requests through the web interface at | ||||
| 317 | L<http://rt.cpan.org>. I will be notified, and then you'll automatically be | ||||
| 318 | notified of progress on your bug as I make changes. | ||||
| 319 | |||||
| 320 | =head1 COPYRIGHT | ||||
| 321 | |||||
| 322 | Copyright 2005-2006 Ricardo Signes, All Rights Reserved. | ||||
| 323 | |||||
| 324 | This program is free software; you can redistribute it and/or modify it | ||||
| 325 | under the same terms as Perl itself. | ||||
| 326 | |||||
| 327 | =cut | ||||
| 328 | |||||
| 329 | 1 | 13µs | 1; | ||
# spent 29µs within Sub::Install::CORE:qr which was called 3 times, avg 10µs/call:
# once (16µs+0s) by Sub::Install::BEGIN@139 at line 140 of Sub/Install.pm
# once (10µs+0s) by Sub::Install::BEGIN@139 at line 144 of Sub/Install.pm
# once (2µs+0s) by Sub::Install::BEGIN@148 at line 148 of Sub/Install.pm |