← 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:41:54 2011

File /usr/lib/perl5/vendor_perl/5.10.1/Config/Any.pm
Statements Executed 124
Statement Execution Time 5.32ms
Subroutines — ordered by exclusive time
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111867µs161msConfig::Any::::_loadConfig::Any::_load
221306µs70.2msConfig::Any::::pluginsConfig::Any::plugins
722254µs254µsConfig::Any::::CORE:regcompConfig::Any::CORE:regcomp (opcode)
111215µs41.2msConfig::Any::::extensionsConfig::Any::extensions
211128µs192µsConfig::Any::::finderConfig::Any::finder
11183µs161msConfig::Any::::load_filesConfig::Any::load_files
11151µs62µsConfig::Any::::BEGIN@3Config::Any::BEGIN@3
72248µs48µsConfig::Any::::CORE:matchConfig::Any::CORE:match (opcode)
11133µs187µsConfig::Any::::BEGIN@6Config::Any::BEGIN@6
11131µs81µsConfig::Any::::BEGIN@4Config::Any::BEGIN@4
21222µs22µsConfig::Any::::CORE:ftfileConfig::Any::CORE:ftfile (opcode)
11118µs18µsConfig::Any::::BEGIN@7Config::Any::BEGIN@7
0000s0sConfig::Any::::_support_errorConfig::Any::_support_error
0000s0sConfig::Any::::load_stemsConfig::Any::load_stems
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Config::Any;
2
33145µs274µs
# spent 62µs (51+11) within Config::Any::BEGIN@3 which was called # once (51µs+11µs) by Catalyst::Plugin::ConfigLoader::BEGIN@6 at line 3
use strict;
# spent 62µs making 1 call to Config::Any::BEGIN@3 # spent 11µs making 1 call to strict::import
4379µs2131µs
# spent 81µs (31+50) within Config::Any::BEGIN@4 which was called # once (31µs+50µs) by Catalyst::Plugin::ConfigLoader::BEGIN@6 at line 4
use warnings;
# spent 81µs making 1 call to Config::Any::BEGIN@4 # spent 50µs making 1 call to warnings::import
5
6380µs2341µs
# spent 187µs (33+154) within Config::Any::BEGIN@6 which was called # once (33µs+154µs) by Catalyst::Plugin::ConfigLoader::BEGIN@6 at line 6
use Carp;
# spent 187µs making 1 call to Config::Any::BEGIN@6 # spent 154µs making 1 call to Exporter::import
733.23ms118µs
# spent 18µs within Config::Any::BEGIN@7 which was called # once (18µs+0s) by Catalyst::Plugin::ConfigLoader::BEGIN@6 at line 7
use Module::Pluggable::Object ();
# spent 18µs making 1 call to Config::Any::BEGIN@7
8
913µsour $VERSION = '0.19';
10
11=head1 NAME
12
13Config::Any - Load configuration from different file formats, transparently
14
15=head1 SYNOPSIS
16
17 use Config::Any;
18
19 my $cfg = Config::Any->load_stems({stems => \@filepath_stems, ... });
20 # or
21 my $cfg = Config::Any->load_files({files => \@filepaths, ... });
22
23 for (@$cfg) {
24 my ($filename, $config) = %$_;
25 $class->config($config);
26 warn "loaded config from file: $filename";
27 }
28
29=head1 DESCRIPTION
30
31L<Config::Any|Config::Any> provides a facility for Perl applications and libraries
32to load configuration data from multiple different file formats. It supports XML, YAML,
33JSON, Apache-style configuration, Windows INI files, and even Perl code.
34
35The rationale for this module is as follows: Perl programs are deployed on many different
36platforms and integrated with many different systems. Systems administrators and end
37users may prefer different configuration formats than the developers. The flexibility
38inherent in a multiple format configuration loader allows different users to make
39different choices, without generating extra work for the developers. As a developer
40you only need to learn a single interface to be able to use the power of different
41configuration formats.
42
43=head1 INTERFACE
44
45=cut
46
47=head2 load_files( \%args )
48
49 Config::Any->load_files( { files => \@files } );
50 Config::Any->load_files( { files => \@files, filter => \&filter } );
51 Config::Any->load_files( { files => \@files, use_ext => 1 } );
52 Config::Any->load_files( { files => \@files, flatten_to_hash => 1 } );
53
54C<load_files()> attempts to load configuration from the list of files passed in
55the C<files> parameter, if the file exists.
56
57If the C<filter> parameter is set, it is used as a callback to modify the configuration
58data before it is returned. It will be passed a single hash-reference parameter which
59it should modify in-place.
60
61If the C<use_ext> parameter is defined, the loader will attempt to parse the file
62extension from each filename and will skip the file unless it matches a standard
63extension for the loading plugins. Only plugins whose standard extensions match the
64file extension will be used. For efficiency reasons, its use is encouraged, but
65be aware that you will lose flexibility -- for example, a file called C<myapp.cfg>
66containing YAML data will not be offered to the YAML plugin, whereas C<myapp.yml>
67or C<myapp.yaml> would be.
68
69When the C<flatten_to_hash> parameter is defined, the loader will return a hash
70keyed on the file names, as opposed to the usual list of single-key hashes.
71
72C<load_files()> also supports a 'force_plugins' parameter, whose value should be an
73arrayref of plugin names like C<Config::Any::INI>. Its intended use is to allow the use
74of a non-standard file extension while forcing it to be offered to a particular parser.
75It is not compatible with 'use_ext'.
76
77You can supply a C<driver_args> hashref to pass special options to a particular
78parser object. Example:
79
80 Config::Any->load_files( { files => \@files, driver_args => {
81 General => { -LowerCaseNames => 1 }
82 } )
83
84=cut
85
86
# spent 161ms (83µs+161) within Config::Any::load_files which was called # once (83µs+161ms) by Catalyst::Plugin::ConfigLoader::setup at line 80 of Catalyst/Plugin/ConfigLoader.pm
sub load_files {
8715µs my ( $class, $args ) = @_;
88
8914µs unless ( $args && exists $args->{ files } ) {
90 warn "No files specified!";
91 return;
92 }
93
94120µs1161ms return $class->_load( $args );
# spent 161ms making 1 call to Config::Any::_load
95}
96
97=head2 load_stems( \%args )
98
99 Config::Any->load_stems( { stems => \@stems } );
100 Config::Any->load_stems( { stems => \@stems, filter => \&filter } );
101 Config::Any->load_stems( { stems => \@stems, use_ext => 1 } );
102 Config::Any->load_stems( { stems => \@stems, flatten_to_hash => 1 } );
103
104C<load_stems()> attempts to load configuration from a list of files which it generates
105by combining the filename stems list passed in the C<stems> parameter with the
106potential filename extensions from each loader, which you can check with the
107C<extensions()> classmethod described below. Once this list of possible filenames is
108built it is treated exactly as in C<load_files()> above, as which it takes the same
109parameters. Please read the C<load_files()> documentation before using this method.
110
111=cut
112
113sub load_stems {
114 my ( $class, $args ) = @_;
115
116 unless ( $args && exists $args->{ stems } ) {
117 warn "No stems specified!";
118 return;
119 }
120
121 my $stems = delete $args->{ stems };
122 my @files;
123 for my $s ( @$stems ) {
124 for my $ext ( $class->extensions ) {
125 push @files, "$s.$ext";
126 }
127 }
128
129 $args->{ files } = \@files;
130 return $class->_load( $args );
131}
132
133
# spent 161ms (867µs+160) within Config::Any::_load which was called # once (867µs+160ms) by Config::Any::load_files at line 94
sub _load {
13413µs my ( $class, $args ) = @_;
135110µs croak "_load requires a arrayref of file paths" unless $args->{ files };
136
13714µs my $force = defined $args->{ force_plugins };
13813µs if ( !$force and !defined $args->{ use_ext } ) {
139 warn
140 "use_ext argument was not explicitly set, as of 0.09, this is true by default";
141 $args->{ use_ext } = 1;
142 }
143
144 # figure out what plugins we're using
145 my @plugins = $force
146125µs129.3ms ? map { eval "require $_;"; $_; } @{ $args->{ force_plugins } }
# spent 29.3ms making 1 call to Config::Any::plugins
147 : $class->plugins;
148
149 # map extensions if we have to
15012µs my ( %extension_lut, $extension_re );
15114µs my $use_ext_lut = !$force && $args->{ use_ext };
15215µs if ( $use_ext_lut ) {
15314µs for my $plugin ( @plugins ) {
154689µs643µs for ( $plugin->extensions ) {
# spent 8µs making 1 call to Config::Any::General::extensions # spent 8µs making 1 call to Config::Any::JSON::extensions # spent 7µs making 1 call to Config::Any::YAML::extensions # spent 7µs making 1 call to Config::Any::Perl::extensions # spent 7µs making 1 call to Config::Any::INI::extensions # spent 6µs making 1 call to Config::Any::XML::extensions
1551042µs $extension_lut{ $_ } ||= [];
1561053µs push @{ $extension_lut{ $_ } }, $plugin;
157 }
158 }
159
160114µs $extension_re = join( '|', keys %extension_lut );
161 }
162
163 # map args to plugins
16412µs my $base_class = __PACKAGE__;
16512µs my %loader_args;
16615µs for my $plugin ( @plugins ) {
1676314µs12224µs $plugin =~ m{^$base_class\::(.+)};
# spent 185µs making 6 calls to Config::Any::CORE:regcomp, avg 31µs/call # spent 38µs making 6 calls to Config::Any::CORE:match, avg 6µs/call
168657µs $loader_args{ $plugin } = $args->{ driver_args }->{ $1 } || {};
169 }
170
17112µs my @results;
172
1731187µs for my $filename ( @{ $args->{ files } } ) {
174
175 # don't even bother if it's not there
176251µs222µs next unless -f $filename;
# spent 22µs making 2 calls to Config::Any::CORE:ftfile, avg 11µs/call
177
17817µs my @try_plugins = @plugins;
179
18014µs if ( $use_ext_lut ) {
181198µs278µs $filename =~ m{\.($extension_re)\z};
# spent 69µs making 1 call to Config::Any::CORE:regcomp # spent 10µs making 1 call to Config::Any::CORE:match
182
18314µs if ( !$1 ) {
184 $filename =~ m{\.([^.]+)\z};
185 croak "There are no loaders available for .${1} files";
186 }
187
18818µs @try_plugins = @{ $extension_lut{ $1 } };
189 }
190
191 # not using use_ext means we try all plugins anyway, so we'll
192 # ignore it for the "unsupported" error
19312µs my $supported = $use_ext_lut ? 0 : 1;
19413µs for my $loader ( @try_plugins ) {
195122µs1129ms next unless $loader->is_supported;
# spent 129ms making 1 call to Config::Any::Base::is_supported
19612µs $supported = 1;
197 my @configs
198222µs11.09ms = eval { $loader->load( $filename, $loader_args{ $loader } ); };
# spent 1.09ms making 1 call to Config::Any::YAML::load
199
200 # fatal error if we used extension matching
20112µs croak "Error parsing $filename: $@" if $@ and $use_ext_lut;
20212µs next if $@ or !@configs;
203
204 # post-process config with a filter callback
20516µs if ( $args->{ filter } ) {
206223µs132µs $args->{ filter }->( $_ ) for @configs;
# spent 32µs making 1 call to Catalyst::Plugin::ConfigLoader::_fix_syntax
207 }
208
20917µs push @results,
210 { $filename => @configs == 1 ? $configs[ 0 ] : \@configs };
21114µs last;
212 }
213
21415µs if ( !$supported ) {
215 croak
216 "Cannot load $filename: required support modules are not available.\nPlease install "
217 . join( " OR ", map { _support_error( $_ ) } @try_plugins );
218 }
219 }
220
22114µs if ( defined $args->{ flatten_to_hash } ) {
222 my %flattened = map { %$_ } @results;
223 return \%flattened;
224 }
225
226140µs return \@results;
227}
228
229sub _support_error {
230 my $module = shift;
231 if ( $module->can( 'requires_all_of' ) ) {
232 return join( ' and ',
233 map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_all_of );
234 }
235 if ( $module->can( 'requires_any_of' ) ) {
236 return 'one of '
237 . join( ' or ',
238 map { ref $_ ? join( ' ', @$_ ) : $_ } $module->requires_any_of );
239 }
240}
241
242=head2 finder( )
243
244The C<finder()> classmethod returns the
245L<Module::Pluggable::Object|Module::Pluggable::Object>
246object which is used to load the plugins. See the documentation for that module for
247more information.
248
249=cut
250
251
# spent 192µs (128+64) within Config::Any::finder which was called 2 times, avg 96µs/call: # 2 times (128µs+64µs) by Config::Any::plugins at line 272, avg 96µs/call
sub finder {
25224µs my $class = shift;
253241µs264µs my $finder = Module::Pluggable::Object->new(
# spent 64µs making 2 calls to Module::Pluggable::Object::new, avg 32µs/call
254 search_path => [ __PACKAGE__ ],
255 except => [ __PACKAGE__ . '::Base' ],
256 require => 1
257 );
258221µs return $finder;
259}
260
261=head2 plugins( )
262
263The C<plugins()> classmethod returns the names of configuration loading plugins as
264found by L<Module::Pluggable::Object|Module::Pluggable::Object>.
265
266=cut
267
268
# spent 70.2ms (306µs+69.9) within Config::Any::plugins which was called 2 times, avg 35.1ms/call: # once (134µs+40.8ms) by Config::Any::extensions at line 286 # once (172µs+29.1ms) by Config::Any::_load at line 146
sub plugins {
26924µs my $class = shift;
270
271 # filter out things that don't look like our plugins
27214360µs1669.9ms return grep { $_->isa( 'Config::Any::Base' ) } $class->finder->plugins;
# spent 69.7ms making 2 calls to Module::Pluggable::Object::plugins, avg 34.8ms/call # spent 192µs making 2 calls to Config::Any::finder, avg 96µs/call # spent 65µs making 12 calls to UNIVERSAL::isa, avg 5µs/call
273}
274
275=head2 extensions( )
276
277The C<extensions()> classmethod returns the possible file extensions which can be loaded
278by C<load_stems()> and C<load_files()>. This may be useful if you set the C<use_ext>
279parameter to those methods.
280
281=cut
282
283
# spent 41.2ms (215µs+41.0) within Config::Any::extensions which was called # once (215µs+41.0ms) by Catalyst::Plugin::ConfigLoader::find_files at line 136 of Catalyst/Plugin/ConfigLoader.pm
sub extensions {
28413µs my $class = shift;
285 my @ext
286790µs741.0ms = map { $_->extensions } $class->plugins;
# spent 40.9ms making 1 call to Config::Any::plugins # spent 8µs making 1 call to Config::Any::General::extensions # spent 7µs making 1 call to Config::Any::JSON::extensions # spent 7µs making 1 call to Config::Any::INI::extensions # spent 7µs making 1 call to Config::Any::YAML::extensions # spent 7µs making 1 call to Config::Any::Perl::extensions # spent 6µs making 1 call to Config::Any::XML::extensions
287171µs return wantarray ? @ext : \@ext;
288}
289
290=head1 DIAGNOSTICS
291
292=over
293
294=item C<No files specified!> or C<No stems specified!>
295
296The C<load_files()> and C<load_stems()> methods will issue this warning if
297called with an empty list of files/stems to load.
298
299=item C<_load requires a arrayref of file paths>
300
301This fatal error will be thrown by the internal C<_load> method. It should not occur
302but is specified here for completeness. If your code dies with this error, please
303email a failing test case to the authors below.
304
305=back
306
307=head1 CONFIGURATION AND ENVIRONMENT
308
309Config::Any requires no configuration files or environment variables.
310
311=head1 DEPENDENCIES
312
313L<Module::Pluggable|Module::Pluggable>
314
315And at least one of the following:
316L<Config::General|Config::General>
317L<Config::Tiny|Config::Tiny>
318L<JSON|JSON>
319L<YAML|YAML>
320L<JSON::Syck|JSON::Syck>
321L<YAML::Syck|YAML::Syck>
322L<XML::Simple|XML::Simple>
323
324=head1 INCOMPATIBILITIES
325
326None reported.
327
328=head1 BUGS AND LIMITATIONS
329
330No bugs have been reported.
331
332Please report any bugs or feature requests to
333C<bug-config-any@rt.cpan.org>, or through the web interface at
334L<http://rt.cpan.org>.
335
336=head1 AUTHOR
337
338Joel Bernstein E<lt>rataxis@cpan.orgE<gt>
339
340=head1 CONTRIBUTORS
341
342This module was based on the original
343L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
344module by Brian Cassidy C<< <bricas@cpan.org> >>.
345
346With ideas and support from Matt S Trout C<< <mst@shadowcatsystems.co.uk> >>.
347
348Further enhancements suggested by Evan Kaufman C<< <evank@cpan.org> >>.
349
350=head1 LICENCE AND COPYRIGHT
351
352Copyright (c) 2006, Portugal Telecom C<< http://www.sapo.pt/ >>. All rights reserved.
353Portions copyright 2007, Joel Bernstein C<< <rataxis@cpan.org> >>.
354
355This module is free software; you can redistribute it and/or
356modify it under the same terms as Perl itself. See L<perlartistic>.
357
358=head1 DISCLAIMER OF WARRANTY
359
360BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
361FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
362OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
363PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
364EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
365WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
366ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
367YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
368NECESSARY SERVICING, REPAIR, OR CORRECTION.
369
370IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
371WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
372REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
373LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
374OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
375THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
376RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
377FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
378SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
379SUCH DAMAGES.
380
381=head1 SEE ALSO
382
383L<Catalyst::Plugin::ConfigLoader|Catalyst::Plugin::ConfigLoader>
384-- now a wrapper around this module.
385
386=cut
387
388110µs"Drink more beer";
# spent 22µs within Config::Any::CORE:ftfile which was called 2 times, avg 11µs/call: # 2 times (22µs+0s) by Config::Any::_load at line 176 of Config/Any.pm, avg 11µs/call
sub Config::Any::CORE:ftfile; # xsub
# spent 48µs within Config::Any::CORE:match which was called 7 times, avg 7µs/call: # 6 times (38µs+0s) by Config::Any::_load at line 167 of Config/Any.pm, avg 6µs/call # once (10µs+0s) by Config::Any::_load at line 181 of Config/Any.pm
sub Config::Any::CORE:match; # xsub
# spent 254µs within Config::Any::CORE:regcomp which was called 7 times, avg 36µs/call: # 6 times (185µs+0s) by Config::Any::_load at line 167 of Config/Any.pm, avg 31µs/call # once (69µs+0s) by Config::Any::_load at line 181 of Config/Any.pm
sub Config::Any::CORE:regcomp; # xsub