← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/bin/epoll_server.pl
  Run on Wed Jan 5 05:34:33 2011
Reported on Wed Jan 5 05:39:06 2011

File /usr/lib/perl5/vendor_perl/5.10.0/Catalyst/Plugin/ConfigLoader.pm
Statements Executed 302
Statement Execution Time 9.68ms
Subroutines — ordered by exclusive time
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1117.47ms134msCatalyst::Plugin::ConfigLoader::::BEGIN@8Catalyst::Plugin::ConfigLoader::BEGIN@8
1113.91ms4.27msCatalyst::Plugin::ConfigLoader::::BEGIN@6Catalyst::Plugin::ConfigLoader::BEGIN@6
21112.74ms11.6msCatalyst::Plugin::ConfigLoader::::config_substitutionsCatalyst::Plugin::ConfigLoader::config_substitutions
2111459µs12.1msCatalyst::Plugin::ConfigLoader::::__ANON__[:269]Catalyst::Plugin::ConfigLoader::__ANON__[:269]
111360µs309msCatalyst::Plugin::ConfigLoader::::setupCatalyst::Plugin::ConfigLoader::setup
2332287µs287µsCatalyst::Plugin::ConfigLoader::::CORE:regcompCatalyst::Plugin::ConfigLoader::CORE:regcomp (opcode)
111239µs1.01msCatalyst::Plugin::ConfigLoader::::get_config_pathCatalyst::Plugin::ConfigLoader::get_config_path
111178µs42.9msCatalyst::Plugin::ConfigLoader::::find_filesCatalyst::Plugin::ConfigLoader::find_files
111157µs1.28msCatalyst::Plugin::ConfigLoader::::load_configCatalyst::Plugin::ConfigLoader::load_config
111122µs137µsCatalyst::Plugin::ConfigLoader::::BEGIN@3Catalyst::Plugin::ConfigLoader::BEGIN@3
11194µs32.6msCatalyst::Plugin::ConfigLoader::::finalize_configCatalyst::Plugin::ConfigLoader::finalize_config
22191µs1.14msCatalyst::Plugin::ConfigLoader::::get_config_local_suffixCatalyst::Plugin::ConfigLoader::get_config_local_suffix
222284µs84µsCatalyst::Plugin::ConfigLoader::::CORE:substCatalyst::Plugin::ConfigLoader::CORE:subst (opcode)
11140µs98µsCatalyst::Plugin::ConfigLoader::::BEGIN@4Catalyst::Plugin::ConfigLoader::BEGIN@4
11138µs44µsCatalyst::Plugin::ConfigLoader::::BEGIN@7Catalyst::Plugin::ConfigLoader::BEGIN@7
11132µs32µsCatalyst::Plugin::ConfigLoader::::_fix_syntaxCatalyst::Plugin::ConfigLoader::_fix_syntax
11119µs19µsCatalyst::Plugin::ConfigLoader::::BEGIN@9Catalyst::Plugin::ConfigLoader::BEGIN@9
22215µs15µsCatalyst::Plugin::ConfigLoader::::CORE:matchCatalyst::Plugin::ConfigLoader::CORE:match (opcode)
11211µs11µsCatalyst::Plugin::ConfigLoader::::CORE:ftdirCatalyst::Plugin::ConfigLoader::CORE:ftdir (opcode)
2128µs8µsCatalyst::Plugin::ConfigLoader::::CORE:substcontCatalyst::Plugin::ConfigLoader::CORE:substcont (opcode)
1126µs6µsCatalyst::Plugin::ConfigLoader::::CORE:sortCatalyst::Plugin::ConfigLoader::CORE:sort (opcode)
0000s0sCatalyst::Plugin::ConfigLoader::::__ANON__[:309]Catalyst::Plugin::ConfigLoader::__ANON__[:309]
0000s0sCatalyst::Plugin::ConfigLoader::::__ANON__[:320]Catalyst::Plugin::ConfigLoader::__ANON__[:320]
0000s0sCatalyst::Plugin::ConfigLoader::::__ANON__[:321]Catalyst::Plugin::ConfigLoader::__ANON__[:321]
0000s0sCatalyst::Plugin::ConfigLoader::::__ANON__[:322]Catalyst::Plugin::ConfigLoader::__ANON__[:322]
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Catalyst::Plugin::ConfigLoader;
2
33164µs2152µs
# spent 137µs (122+15) within Catalyst::Plugin::ConfigLoader::BEGIN@3 which was called # once (122µs+15µs) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 3
use strict;
# spent 137µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@3 # spent 15µs making 1 call to strict::import
43239µs2156µs
# spent 98µs (40+58) within Catalyst::Plugin::ConfigLoader::BEGIN@4 which was called # once (40µs+58µs) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 4
use warnings;
# spent 98µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@4 # spent 58µs making 1 call to warnings::import
5
63586µs24.28ms
# spent 4.27ms (3.91+357µs) within Catalyst::Plugin::ConfigLoader::BEGIN@6 which was called # once (3.91ms+357µs) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 6
use Config::Any;
# spent 4.27ms making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@6 # spent 9µs making 1 call to UNIVERSAL::import
7395µs250µs
# spent 44µs (38+6) within Catalyst::Plugin::ConfigLoader::BEGIN@7 which was called # once (38µs+6µs) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 7
use MRO::Compat;
# spent 44µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@7 # spent 6µs making 1 call to UNIVERSAL::import
83382µs2134ms
# spent 134ms (7.47+126) within Catalyst::Plugin::ConfigLoader::BEGIN@8 which was called # once (7.47ms+126ms) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 8
use Data::Visitor::Callback;
# spent 134ms making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@8 # spent 8µs making 1 call to UNIVERSAL::import
933.56ms119µs
# spent 19µs within Catalyst::Plugin::ConfigLoader::BEGIN@9 which was called # once (19µs+0s) by Class::MOP::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP.pm:103] at line 9
use Catalyst::Utils ();
# spent 19µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@9
10
1113µsour $VERSION = '0.27';
12
13=head1 NAME
14
15Catalyst::Plugin::ConfigLoader - Load config files of various types
16
17=head1 SYNOPSIS
18
19 package MyApp;
20
21 # ConfigLoader should be first in your list so
22 # other plugins can get the config information
23 use Catalyst qw( ConfigLoader ... );
24
25 # by default myapp.* will be loaded
26 # you can specify a file if you'd like
27 __PACKAGE__->config( 'Plugin::ConfigLoader' => { file => 'config.yaml' } );
28
29 In the file, assuming it's in YAML format:
30
31 foo: bar
32
33 Accessible through the context object, or the class itself
34
35 $c->config->{foo} # bar
36 MyApp->config->{foo} # bar
37
38=head1 DESCRIPTION
39
40This module will attempt to load find and load a configuration
41file of various types. Currently it supports YAML, JSON, XML,
42INI and Perl formats. Special configuration for a particular driver format can
43be stored in C<MyApp-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ driver }>.
44For example, to pass arguments to L<Config::General>, use the following:
45
46 __PACKAGE__->config( 'Plugin::ConfigLoader' => {
47 driver => {
48 'General' => { -LowerCaseNames => 1 }
49 }
50 } );
51
52See L<Config::Any>'s C<driver_args> parameter for more information.
53
54To support the distinction between development and production environments,
55this module will also attemp to load a local config (e.g. myapp_local.yaml)
56which will override any duplicate settings. See
57L<get_config_local_suffix|/get_config_local_suffix>
58for details on how this is configured.
59
60=head1 METHODS
61
62=head2 setup( )
63
64This method is automatically called by Catalyst's setup routine. It will
65attempt to use each plugin and, once a file has been successfully
66loaded, set the C<config()> section.
67
68=cut
69
70
# spent 309ms (360µs+309) within Catalyst::Plugin::ConfigLoader::setup which was called # once (360µs+309ms) by Catalyst::setup at line 1137 of Catalyst.pm
sub setup {
7111337µs my $c = shift;
72 my @files = $c->find_files;
# spent 42.9ms making 1 call to Catalyst::Plugin::ConfigLoader::find_files
73 my $cfg = Config::Any->load_files(
74 { files => \@files,
75 filter => \&_fix_syntax,
76 use_ext => 1,
77 driver_args => $c->config->{ 'Plugin::ConfigLoader' }->{ driver }
78 || {},
79 }
80 );
# spent 161ms making 1 call to Config::Any::load_files # spent 423µs making 1 call to Catalyst::config
81 # map the array of hashrefs to a simple hash
82 my %configs = map { %$_ } @$cfg;
83
84 # split the responses into normal and local cfg
85 my $local_suffix = $c->get_config_local_suffix;
86 my ( @main, @locals );
87 for ( sort keys %configs ) {
# spent 6µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:sort
88258µs226µs if ( m{$local_suffix\.}ms ) {
# spent 23µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:regcomp # spent 3µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:match
89 push @locals, $_;
90 }
91 else {
92 push @main, $_;
93 }
94 }
95
96 # load all the normal cfgs, then the local cfgs last so they can override
97 # normal cfgs
98 $c->load_config( { $_ => $configs{ $_ } } ) for @main, @locals;
# spent 1.28ms making 1 call to Catalyst::Plugin::ConfigLoader::load_config
99
100130µs232.6ms $c->finalize_config;
# spent 32.6ms making 1 call to Catalyst::Plugin::ConfigLoader::finalize_config # spent 26µs making 1 call to Data::Visitor::Callback::DESTROY
101 $c->next::method( @_ );
# spent 636µs making 1 call to next::method
102}
103
104=head2 load_config
105
106This method handles loading the configuration data into the Catalyst
107context object. It does not return a value.
108
109=cut
110
111
# spent 1.28ms (157µs+1.12) within Catalyst::Plugin::ConfigLoader::load_config which was called # once (157µs+1.12ms) by Catalyst::Plugin::ConfigLoader::setup at line 98
sub load_config {
112688µs my $c = shift;
113 my $ref = shift;
114
115 my ( $file, $config ) = %$ref;
116
117 $c->config( $config );
# spent 862µs making 1 call to Catalyst::config
118 $c->log->debug( qq(Loaded Config "$file") )
# spent 186µs making 1 call to Catalyst::Log::debug # spent 62µs making 1 call to Catalyst::_log_accessor # spent 7µs making 1 call to Epoll::debug
119 if $c->debug;
120
121 return;
122}
123
124=head2 find_files
125
126This method determines the potential file paths to be used for config loading.
127It returns an array of paths (up to the filename less the extension) to pass to
128L<Config::Any|Config::Any> for loading.
129
130=cut
131
132
# spent 42.9ms (178µs+42.8) within Catalyst::Plugin::ConfigLoader::find_files which was called # once (178µs+42.8ms) by Catalyst::Plugin::ConfigLoader::setup at line 72
sub find_files {
133785µs my $c = shift;
134 my ( $path, $extension ) = $c->get_config_path;
# spent 1.01ms making 1 call to Catalyst::Plugin::ConfigLoader::get_config_path
135 my $suffix = $c->get_config_local_suffix;
136 my @extensions = @{ Config::Any->extensions };
# spent 41.2ms making 1 call to Config::Any::extensions
137
138 my @files;
1393113µs if ( $extension ) {
140 die "Unable to handle files with the extension '${extension}'"
141 unless grep { $_ eq $extension } @extensions;
142 ( my $local = $path ) =~ s{\.$extension}{_$suffix.$extension};
# spent 25µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:regcomp # spent 11µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:subst # spent 8µs making 2 calls to Catalyst::Plugin::ConfigLoader::CORE:substcont, avg 4µs/call
143 push @files, $path, $local;
144 }
145 else {
146 @files = map { ( "$path.$_", "${path}_${suffix}.$_" ) } @extensions;
147 }
148 @files;
149}
150
151=head2 get_config_path
152
153This method determines the path, filename prefix and file extension to be used
154for config loading. It returns the path (up to the filename less the
155extension) to check and the specific extension to use (if it was specified).
156
157The order of preference is specified as:
158
159=over 4
160
161=item * C<$ENV{ MYAPP_CONFIG }>
162
163=item * C<$ENV{ CATALYST_CONFIG }>
164
165=item * C<$c-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ file }>
166
167=item * C<$c-E<gt>path_to( $application_prefix )>
168
169=back
170
171If either of the first two user-specified options are directories, the
172application prefix will be added on to the end of the path.
173
174=cut
175
176
# spent 1.01ms (239µs+769µs) within Catalyst::Plugin::ConfigLoader::get_config_path which was called # once (239µs+769µs) by Catalyst::Plugin::ConfigLoader::find_files at line 134
sub get_config_path {
1777249µs my $c = shift;
178
179
180 my $appname = ref $c || $c;
181 my $prefix = Catalyst::Utils::appprefix( $appname );
# spent 33µs making 1 call to Catalyst::Utils::appprefix
182 my $path = Catalyst::Utils::env_value( $appname, 'CONFIG' )
183 || $c->config->{ 'Plugin::ConfigLoader' }->{ file }
184 || $c->path_to( $prefix );
# spent 649µs making 1 call to Catalyst::config # spent 65µs making 1 call to Catalyst::Utils::env_value
185
186 my ( $extension ) = ( $path =~ m{\.(.{1,4})$} );
# spent 12µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:match
187
188 if ( -d $path ) {
# spent 11µs making 1 call to Catalyst::Plugin::ConfigLoader::CORE:ftdir
189 $path =~ s{[\/\\]$}{};
190 $path .= "/$prefix";
191 }
192
193 return ( $path, $extension );
194}
195
196=head2 get_config_local_suffix
197
198Determines the suffix of files used to override the main config. By default
199this value is C<local>, which will load C<myapp_local.conf>. The suffix can
200be specified in the following order of preference:
201
202=over 4
203
204=item * C<$ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }>
205
206=item * C<$ENV{ CATALYST_CONFIG_LOCAL_SUFFIX }>
207
208=item * C<$c-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ config_local_suffix }>
209
210=back
211
212The first one of these values found replaces the default of C<local> in the
213name of the local config file to be loaded.
214
215For example, if C< $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> is set to C<testing>,
216ConfigLoader will try and load C<myapp_testing.conf> instead of
217C<myapp_local.conf>.
218
219=cut
220
221
# spent 1.14ms (91µs+1.05) within Catalyst::Plugin::ConfigLoader::get_config_local_suffix which was called 2 times, avg 570µs/call: # once (49µs+585µs) by Catalyst::Plugin::ConfigLoader::setup at line 85 # once (42µs+464µs) by Catalyst::Plugin::ConfigLoader::find_files at line 135
sub get_config_local_suffix {
222890µs my $c = shift;
223
224 my $appname = ref $c || $c;
225 my $suffix = Catalyst::Utils::env_value( $appname, 'CONFIG_LOCAL_SUFFIX' )
226 || $c->config->{ 'Plugin::ConfigLoader' }->{ config_local_suffix }
227 || 'local';
# spent 908µs making 2 calls to Catalyst::config, avg 454µs/call # spent 141µs making 2 calls to Catalyst::Utils::env_value, avg 70µs/call
228
229 return $suffix;
230}
231
232
# spent 32µs within Catalyst::Plugin::ConfigLoader::_fix_syntax which was called # once (32µs+0s) by Config::Any::_load at line 206 of Config/Any.pm
sub _fix_syntax {
233341µs my $config = shift;
234 my @components = (
235 map +{
236 prefix => $_ eq 'Component' ? '' : $_ . '::',
237 values => delete $config->{ lc $_ } || delete $config->{ $_ }
238 },
239 grep { ref $config->{ lc $_ } || ref $config->{ $_ } }
240 qw( Component Model M View V Controller C Plugin )
241 );
242
243 foreach my $comp ( @components ) {
244 my $prefix = $comp->{ prefix };
245 foreach my $element ( keys %{ $comp->{ values } } ) {
246 $config->{ "$prefix$element" } = $comp->{ values }->{ $element };
247 }
248 }
249}
250
251=head2 finalize_config
252
253This method is called after the config file is loaded. It can be
254used to implement tuning of config values that can only be done
255at runtime. If you need to do this to properly configure any
256plugins, it's important to load ConfigLoader before them.
257ConfigLoader provides a default finalize_config method which
258walks through the loaded config hash and calls the C<config_substitutions>
259sub on any string.
260
261=cut
262
263
# spent 32.6ms (94µs+32.5) within Catalyst::Plugin::ConfigLoader::finalize_config which was called # once (94µs+32.5ms) by Catalyst::Plugin::ConfigLoader::setup at line 100
sub finalize_config {
264359µs my $c = shift;
265 my $v = Data::Visitor::Callback->new(
266
# spent 12.1ms (459µs+11.6) within Catalyst::Plugin::ConfigLoader::__ANON__[/usr/lib/perl5/vendor_perl/5.10.0/Catalyst/Plugin/ConfigLoader.pm:269] which was called 21 times, avg 577µs/call: # 21 times (459µs+11.6ms) by Data::Visitor::Callback::callback at line 251 of Data/Visitor/Callback.pm, avg 577µs/call
plain_value => sub {
26742386µs return unless defined $_;
268 $c->config_substitutions( $_ );
# spent 11.6ms making 21 calls to Catalyst::Plugin::ConfigLoader::config_substitutions, avg 555µs/call
269 }
270 );
# spent 1.34ms making 1 call to Data::Visitor::Callback::new
271 $v->visit( $c->config );
# spent 30.7ms making 1 call to Data::Visitor::Callback::visit # spent 371µs making 1 call to Catalyst::config
272}
273
274=head2 config_substitutions( $value )
275
276This method substitutes macros found with calls to a function. There are three
277default macros:
278
279=over 4
280
281=item * C<__HOME__> - replaced with C<$c-E<gt>path_to('')>
282
283=item * C<__ENV(foo)__> - replaced with the value of C<$ENV{foo}>
284
285=item * C<__path_to(foo/bar)__> - replaced with C<$c-E<gt>path_to('foo/bar')>
286
287=item * C<__literal(__FOO__)__> - leaves __FOO__ alone (allows you to use
288C<__DATA__> as a config value, for example)
289
290=back
291
292The parameter list is split on comma (C<,>). You can override this method to
293do your own string munging, or you can define your own macros in
294C<MyApp-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ substitutions }>.
295Example:
296
297 MyApp->config->{ 'Plugin::ConfigLoader' }->{ substitutions } = {
298 baz => sub { my $c = shift; qux( @_ ); }
299 }
300
301The above will respond to C<__baz(x,y)__> in config strings.
302
303=cut
304
305
# spent 11.6ms (2.74+8.91) within Catalyst::Plugin::ConfigLoader::config_substitutions which was called 21 times, avg 555µs/call: # 21 times (2.74ms+8.91ms) by Catalyst::Plugin::ConfigLoader::__ANON__[/usr/lib/perl5/vendor_perl/5.10.0/Catalyst/Plugin/ConfigLoader.pm:269] at line 268, avg 555µs/call
sub config_substitutions {
3061682.22ms my $c = shift;
307 my $subs = $c->config->{ 'Plugin::ConfigLoader' }->{ substitutions }
308 || {};
# spent 8.60ms making 21 calls to Catalyst::config, avg 409µs/call
309 $subs->{ HOME } ||= sub { shift->path_to( '' ); };
310 $subs->{ ENV } ||=
311 sub {
312 my ( $c, $v ) = @_;
313 if (! defined($ENV{$v})) {
314 Catalyst::Exception->throw( message =>
315 "Missing environment variable: $v" );
316 return "";
317 } else {
318 return $ENV{ $v };
319 }
320 };
321 $subs->{ path_to } ||= sub { shift->path_to( @_ ); };
322 $subs->{ literal } ||= sub { return $_[ 1 ]; };
323 my $subsre = join( '|', keys %$subs );
324
325 for ( @_ ) {
32621892µs42311µs s{__($subsre)(?:\((.+?)\))?__}{ $subs->{ $1 }->( $c, $2 ? split( /,/, $2 ) : () ) }eg;
# spent 238µs making 21 calls to Catalyst::Plugin::ConfigLoader::CORE:regcomp, avg 11µs/call # spent 72µs making 21 calls to Catalyst::Plugin::ConfigLoader::CORE:subst, avg 3µs/call
327 }
328}
329
330=head1 AUTHOR
331
332Brian Cassidy E<lt>bricas@cpan.orgE<gt>
333
334=head1 CONTRIBUTORS
335
336The following people have generously donated their time to the
337development of this module:
338
339=over 4
340
341=item * Joel Bernstein E<lt>rataxis@cpan.orgE<gt> - Rewrite to use L<Config::Any>
342
343=item * David Kamholz E<lt>dkamholz@cpan.orgE<gt> - L<Data::Visitor> integration
344
345=item * Stuart Watt - Addition of ENV macro.
346
347=back
348
349Work to this module has been generously sponsored by:
350
351=over 4
352
353=item * Portugal Telecom L<http://www.sapo.pt/> - Work done by Joel Bernstein
354
355=back
356
357=head1 COPYRIGHT AND LICENSE
358
359Copyright 2006-2009 by Brian Cassidy
360
361This library is free software; you can redistribute it and/or modify
362it under the same terms as Perl itself.
363
364=head1 SEE ALSO
365
366=over 4
367
368=item * L<Catalyst>
369
370=item * L<Catalyst::Plugin::ConfigLoader::Manual>
371
372=item * L<Config::Any>
373
374=back
375
376=cut
377
378110µs1;
# spent 11µs within Catalyst::Plugin::ConfigLoader::CORE:ftdir which was called # once (11µs+0s) by Catalyst::Plugin::ConfigLoader::get_config_path at line 188 of Catalyst/Plugin/ConfigLoader.pm
sub Catalyst::Plugin::ConfigLoader::CORE:ftdir; # xsub
# spent 15µs within Catalyst::Plugin::ConfigLoader::CORE:match which was called 2 times, avg 8µs/call: # once (12µs+0s) by Catalyst::Plugin::ConfigLoader::get_config_path at line 186 of Catalyst/Plugin/ConfigLoader.pm # once (3µs+0s) by Catalyst::Plugin::ConfigLoader::setup at line 88 of Catalyst/Plugin/ConfigLoader.pm
sub Catalyst::Plugin::ConfigLoader::CORE:match; # xsub
# spent 287µs within Catalyst::Plugin::ConfigLoader::CORE:regcomp which was called 23 times, avg 12µs/call: # 21 times (238µs+0s) by Catalyst::Plugin::ConfigLoader::config_substitutions at line 326 of Catalyst/Plugin/ConfigLoader.pm, avg 11µs/call # once (25µs+0s) by Catalyst::Plugin::ConfigLoader::find_files at line 142 of Catalyst/Plugin/ConfigLoader.pm # once (23µs+0s) by Catalyst::Plugin::ConfigLoader::setup at line 88 of Catalyst/Plugin/ConfigLoader.pm
sub Catalyst::Plugin::ConfigLoader::CORE:regcomp; # xsub
# spent 6µs within Catalyst::Plugin::ConfigLoader::CORE:sort which was called # once (6µs+0s) by Catalyst::Plugin::ConfigLoader::setup at line 87 of Catalyst/Plugin/ConfigLoader.pm
sub Catalyst::Plugin::ConfigLoader::CORE:sort; # xsub
# spent 84µs within Catalyst::Plugin::ConfigLoader::CORE:subst which was called 22 times, avg 4µs/call: # 21 times (72µs+0s) by Catalyst::Plugin::ConfigLoader::config_substitutions at line 326 of Catalyst/Plugin/ConfigLoader.pm, avg 3µs/call # once (11µs+0s) by Catalyst::Plugin::ConfigLoader::find_files at line 142 of Catalyst/Plugin/ConfigLoader.pm
sub Catalyst::Plugin::ConfigLoader::CORE:subst; # xsub
# spent 8µs within Catalyst::Plugin::ConfigLoader::CORE:substcont which was called 2 times, avg 4µs/call: # 2 times (8µs+0s) by Catalyst::Plugin::ConfigLoader::find_files at line 142 of Catalyst/Plugin/ConfigLoader.pm, avg 4µs/call
sub Catalyst::Plugin::ConfigLoader::CORE:substcont; # xsub