| File | /usr/lib/perl5/vendor_perl/5.10.0/Catalyst/Plugin/ConfigLoader.pm |
| Statements Executed | 302 |
| Statement Execution Time | 9.68ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 7.47ms | 134ms | Catalyst::Plugin::ConfigLoader::BEGIN@8 |
| 1 | 1 | 1 | 3.91ms | 4.27ms | Catalyst::Plugin::ConfigLoader::BEGIN@6 |
| 21 | 1 | 1 | 2.74ms | 11.6ms | Catalyst::Plugin::ConfigLoader::config_substitutions |
| 21 | 1 | 1 | 459µs | 12.1ms | Catalyst::Plugin::ConfigLoader::__ANON__[:269] |
| 1 | 1 | 1 | 360µs | 309ms | Catalyst::Plugin::ConfigLoader::setup |
| 23 | 3 | 2 | 287µs | 287µs | Catalyst::Plugin::ConfigLoader::CORE:regcomp (opcode) |
| 1 | 1 | 1 | 239µs | 1.01ms | Catalyst::Plugin::ConfigLoader::get_config_path |
| 1 | 1 | 1 | 178µs | 42.9ms | Catalyst::Plugin::ConfigLoader::find_files |
| 1 | 1 | 1 | 157µs | 1.28ms | Catalyst::Plugin::ConfigLoader::load_config |
| 1 | 1 | 1 | 122µs | 137µs | Catalyst::Plugin::ConfigLoader::BEGIN@3 |
| 1 | 1 | 1 | 94µs | 32.6ms | Catalyst::Plugin::ConfigLoader::finalize_config |
| 2 | 2 | 1 | 91µs | 1.14ms | Catalyst::Plugin::ConfigLoader::get_config_local_suffix |
| 22 | 2 | 2 | 84µs | 84µs | Catalyst::Plugin::ConfigLoader::CORE:subst (opcode) |
| 1 | 1 | 1 | 40µs | 98µs | Catalyst::Plugin::ConfigLoader::BEGIN@4 |
| 1 | 1 | 1 | 38µs | 44µs | Catalyst::Plugin::ConfigLoader::BEGIN@7 |
| 1 | 1 | 1 | 32µs | 32µs | Catalyst::Plugin::ConfigLoader::_fix_syntax |
| 1 | 1 | 1 | 19µs | 19µs | Catalyst::Plugin::ConfigLoader::BEGIN@9 |
| 2 | 2 | 2 | 15µs | 15µs | Catalyst::Plugin::ConfigLoader::CORE:match (opcode) |
| 1 | 1 | 2 | 11µs | 11µs | Catalyst::Plugin::ConfigLoader::CORE:ftdir (opcode) |
| 2 | 1 | 2 | 8µs | 8µs | Catalyst::Plugin::ConfigLoader::CORE:substcont (opcode) |
| 1 | 1 | 2 | 6µs | 6µs | Catalyst::Plugin::ConfigLoader::CORE:sort (opcode) |
| 0 | 0 | 0 | 0s | 0s | Catalyst::Plugin::ConfigLoader::__ANON__[:309] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::Plugin::ConfigLoader::__ANON__[:320] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::Plugin::ConfigLoader::__ANON__[:321] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::Plugin::ConfigLoader::__ANON__[:322] |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Catalyst::Plugin::ConfigLoader; | ||||
| 2 | |||||
| 3 | 3 | 164µs | 2 | 152µ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 # spent 137µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@3
# spent 15µs making 1 call to strict::import |
| 4 | 3 | 239µs | 2 | 156µ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 # spent 98µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@4
# spent 58µs making 1 call to warnings::import |
| 5 | |||||
| 6 | 3 | 586µs | 2 | 4.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 # spent 4.27ms making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@6
# spent 9µs making 1 call to UNIVERSAL::import |
| 7 | 3 | 95µs | 2 | 50µ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 # spent 44µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@7
# spent 6µs making 1 call to UNIVERSAL::import |
| 8 | 3 | 382µs | 2 | 134ms | # 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 # spent 134ms making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@8
# spent 8µs making 1 call to UNIVERSAL::import |
| 9 | 3 | 3.56ms | 1 | 19µ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 # spent 19µs making 1 call to Catalyst::Plugin::ConfigLoader::BEGIN@9 |
| 10 | |||||
| 11 | 1 | 3µs | our $VERSION = '0.27'; | ||
| 12 | |||||
| 13 | =head1 NAME | ||||
| 14 | |||||
| 15 | Catalyst::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 | |||||
| 40 | This module will attempt to load find and load a configuration | ||||
| 41 | file of various types. Currently it supports YAML, JSON, XML, | ||||
| 42 | INI and Perl formats. Special configuration for a particular driver format can | ||||
| 43 | be stored in C<MyApp-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ driver }>. | ||||
| 44 | For 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 | |||||
| 52 | See L<Config::Any>'s C<driver_args> parameter for more information. | ||||
| 53 | |||||
| 54 | To support the distinction between development and production environments, | ||||
| 55 | this module will also attemp to load a local config (e.g. myapp_local.yaml) | ||||
| 56 | which will override any duplicate settings. See | ||||
| 57 | L<get_config_local_suffix|/get_config_local_suffix> | ||||
| 58 | for details on how this is configured. | ||||
| 59 | |||||
| 60 | =head1 METHODS | ||||
| 61 | |||||
| 62 | =head2 setup( ) | ||||
| 63 | |||||
| 64 | This method is automatically called by Catalyst's setup routine. It will | ||||
| 65 | attempt to use each plugin and, once a file has been successfully | ||||
| 66 | loaded, 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 | ||||
| 71 | 11 | 337µ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; # spent 634µs making 1 call to Catalyst::Plugin::ConfigLoader::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 | ||||
| 88 | 2 | 58µs | 2 | 26µ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 | |||||
| 100 | 1 | 30µs | 2 | 32.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 | |||||
| 106 | This method handles loading the configuration data into the Catalyst | ||||
| 107 | context 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 | ||||
| 112 | 6 | 88µ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 | |||||
| 126 | This method determines the potential file paths to be used for config loading. | ||||
| 127 | It returns an array of paths (up to the filename less the extension) to pass to | ||||
| 128 | L<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 | ||||
| 133 | 7 | 85µ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; # spent 506µs making 1 call to Catalyst::Plugin::ConfigLoader::get_config_local_suffix | ||||
| 136 | my @extensions = @{ Config::Any->extensions }; # spent 41.2ms making 1 call to Config::Any::extensions | ||||
| 137 | |||||
| 138 | my @files; | ||||
| 139 | 3 | 113µ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 | |||||
| 153 | This method determines the path, filename prefix and file extension to be used | ||||
| 154 | for config loading. It returns the path (up to the filename less the | ||||
| 155 | extension) to check and the specific extension to use (if it was specified). | ||||
| 156 | |||||
| 157 | The 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 | |||||
| 171 | If either of the first two user-specified options are directories, the | ||||
| 172 | application 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 | ||||
| 177 | 7 | 249µ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 | |||||
| 198 | Determines the suffix of files used to override the main config. By default | ||||
| 199 | this value is C<local>, which will load C<myapp_local.conf>. The suffix can | ||||
| 200 | be 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 | |||||
| 212 | The first one of these values found replaces the default of C<local> in the | ||||
| 213 | name of the local config file to be loaded. | ||||
| 214 | |||||
| 215 | For example, if C< $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> is set to C<testing>, | ||||
| 216 | ConfigLoader will try and load C<myapp_testing.conf> instead of | ||||
| 217 | C<myapp_local.conf>. | ||||
| 218 | |||||
| 219 | =cut | ||||
| 220 | |||||
| 221 | sub get_config_local_suffix { | ||||
| 222 | 8 | 90µ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 | ||||
| 233 | 3 | 41µ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 | |||||
| 253 | This method is called after the config file is loaded. It can be | ||||
| 254 | used to implement tuning of config values that can only be done | ||||
| 255 | at runtime. If you need to do this to properly configure any | ||||
| 256 | plugins, it's important to load ConfigLoader before them. | ||||
| 257 | ConfigLoader provides a default finalize_config method which | ||||
| 258 | walks through the loaded config hash and calls the C<config_substitutions> | ||||
| 259 | sub 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 | ||||
| 264 | 3 | 59µ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 | ||||
| 267 | 42 | 386µ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 | |||||
| 276 | This method substitutes macros found with calls to a function. There are three | ||||
| 277 | default 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 | ||||
| 288 | C<__DATA__> as a config value, for example) | ||||
| 289 | |||||
| 290 | =back | ||||
| 291 | |||||
| 292 | The parameter list is split on comma (C<,>). You can override this method to | ||||
| 293 | do your own string munging, or you can define your own macros in | ||||
| 294 | C<MyApp-E<gt>config-E<gt>{ 'Plugin::ConfigLoader' }-E<gt>{ substitutions }>. | ||||
| 295 | Example: | ||||
| 296 | |||||
| 297 | MyApp->config->{ 'Plugin::ConfigLoader' }->{ substitutions } = { | ||||
| 298 | baz => sub { my $c = shift; qux( @_ ); } | ||||
| 299 | } | ||||
| 300 | |||||
| 301 | The 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 | ||||
| 306 | 168 | 2.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 ( @_ ) { | ||||
| 326 | 21 | 892µs | 42 | 311µ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 | |||||
| 332 | Brian Cassidy E<lt>bricas@cpan.orgE<gt> | ||||
| 333 | |||||
| 334 | =head1 CONTRIBUTORS | ||||
| 335 | |||||
| 336 | The following people have generously donated their time to the | ||||
| 337 | development 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 | |||||
| 349 | Work 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 | |||||
| 359 | Copyright 2006-2009 by Brian Cassidy | ||||
| 360 | |||||
| 361 | This library is free software; you can redistribute it and/or modify | ||||
| 362 | it 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 | |||||
| 378 | 1 | 10µs | 1; | ||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 |