ConfigLoader 0.04
[catagits/Catalyst-Plugin-ConfigLoader.git] / lib / Catalyst / Plugin / ConfigLoader.pm
index d1a5169..8047225 100644 (file)
@@ -8,8 +8,9 @@ use Module::Pluggable::Fast
     name    => '_config_loaders',\r
     search  => [ __PACKAGE__ ],\r
     require => 1;\r
+use Data::Visitor::Callback;\r
 \r
-our $VERSION = '0.02';\r
+our $VERSION = '0.04';\r
 \r
 =head1 NAME\r
 \r
@@ -19,12 +20,13 @@ Catalyst::Plugin::ConfigLoader - Load config files of various types
 \r
     package MyApp;\r
     \r
-    use Catalyst( qw( ConfigLoader ... ) );\r
+    # ConfigLoader should be first in your list so\r
+    # other plugins can get the config information\r
+    use Catalyst qw( ConfigLoader ... );\r
        \r
     # by default myapp.* will be loaded\r
     # you can specify a file if you'd like\r
-    __PACKAGE__->config( file = > 'config.yaml' );\r
-    \r
+    __PACKAGE__->config( file = > 'config.yaml' );    \r
 \r
 =head1 DESCRIPTION\r
 \r
@@ -37,8 +39,8 @@ INI and Perl formats.
 =head2 setup( )\r
 \r
 This method is automatically called by Catalyst's setup routine. It will\r
-attempt to use each plugin and set the C<config()> section once a file has been\r
-successfully loaded.\r
+attempt to use each plugin and, once a file has been successfully\r
+loaded, set the C<config()> section.\r
 \r
 =cut\r
 \r
@@ -69,9 +71,32 @@ sub setup {
         }\r
     }\r
 \r
+    $c->finalize_config;\r
+\r
     $c->NEXT::setup( @_ );\r
 }\r
 \r
+=head2 finalize_config\r
+\r
+This method is called after the config file is loaded. It can be\r
+used to implement tuning of config values that can only be done\r
+at runtime. If you need to do this to properly configure any\r
+plugins, it's important to load ConfigLoader before them.\r
+ConfigLoader provides a default finalize_config method which\r
+walks through the loaded config hash and replaces any strings\r
+beginning with C<< __HOME__/<path> >> with the full path to\r
+the file inside the app's home directory.\r
+\r
+=cut\r
+\r
+sub finalize_config {\r
+    my $c = shift;\r
+    my $v = Data::Visitor::Callback->new(\r
+        plain_value => sub { s[^__HOME__/(.+)$][ $c->path_to($1) ]e }\r
+    );\r
+    $v->visit($c->config);\r
+}\r
+\r
 =head1 AUTHOR\r
 \r
 =over 4 \r