Version 0.32
[catagits/Catalyst-Plugin-ConfigLoader.git] / lib / Catalyst / Plugin / ConfigLoader.pm
index 16b27d8..4fcfdf1 100644 (file)
@@ -4,11 +4,11 @@ use strict;
 use warnings;
 
 use Config::Any;
-use NEXT;
+use MRO::Compat;
 use Data::Visitor::Callback;
 use Catalyst::Utils ();
 
-our $VERSION = '0.21';
+our $VERSION = '0.32';
 
 =head1 NAME
 
@@ -17,14 +17,14 @@ Catalyst::Plugin::ConfigLoader - Load config files of various types
 =head1 SYNOPSIS
 
     package MyApp;
-    
+
     # ConfigLoader should be first in your list so
     # other plugins can get the config information
     use Catalyst qw( ConfigLoader ... );
-    
+
     # by default myapp.* will be loaded
     # you can specify a file if you'd like
-    __PACKAGE__->config( 'Plugin::ConfigLoader' => { file => 'config.yaml' } );    
+    __PACKAGE__->config( 'Plugin::ConfigLoader' => { file => 'config.yaml' } );
 
   In the file, assuming it's in YAML format:
 
@@ -53,7 +53,9 @@ See L<Config::Any>'s C<driver_args> parameter for more information.
 
 To support the distinction between development and production environments,
 this module will also attemp to load a local config (e.g. myapp_local.yaml)
-which will override any duplicate settings.
+which will override any duplicate settings.  See
+L<get_config_local_suffix|/get_config_local_suffix>
+for details on how this is configured.
 
 =head1 METHODS
 
@@ -61,7 +63,7 @@ which will override any duplicate settings.
 
 This method is automatically called by Catalyst's setup routine. It will
 attempt to use each plugin and, once a file has been successfully
-loaded, set the C<config()> section. 
+loaded, set the C<config()> section.
 
 =cut
 
@@ -96,7 +98,7 @@ sub setup {
     $c->load_config( { $_ => $configs{ $_ } } ) for @main, @locals;
 
     $c->finalize_config;
-    $c->NEXT::setup( @_ );
+    $c->next::method( @_ );
 }
 
 =head2 load_config
@@ -177,11 +179,11 @@ sub get_config_path {
 
     my $appname = ref $c || $c;
     my $prefix  = Catalyst::Utils::appprefix( $appname );
-    my $path    = Catalyst::Utils::env_value( $c, 'CONFIG' )
+    my $path    = Catalyst::Utils::env_value( $appname, 'CONFIG' )
         || $c->config->{ 'Plugin::ConfigLoader' }->{ file }
         || $c->path_to( $prefix );
 
-    my ( $extension ) = ( $path =~ m{\.(.{1,4})$} );
+    my ( $extension ) = ( $path =~ m{\.([^\/\\.]{1,4})$} );
 
     if ( -d $path ) {
         $path =~ s{[\/\\]$}{};
@@ -194,7 +196,8 @@ sub get_config_path {
 =head2 get_config_local_suffix
 
 Determines the suffix of files used to override the main config. By default
-this value is C<local>, but it can be specified in the following order of preference:
+this value is C<local>, which will load C<myapp_local.conf>.  The suffix can
+be specified in the following order of preference:
 
 =over 4
 
@@ -206,13 +209,20 @@ this value is C<local>, but it can be specified in the following order of prefer
 
 =back
 
+The first one of these values found replaces the default of C<local> in the
+name of the local config file to be loaded.
+
+For example, if C< $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX }> is set to C<testing>,
+ConfigLoader will try and load C<myapp_testing.conf> instead of
+C<myapp_local.conf>.
+
 =cut
 
 sub get_config_local_suffix {
     my $c = shift;
 
     my $appname = ref $c || $c;
-    my $suffix = Catalyst::Utils::env_value( $c, 'CONFIG_LOCAL_SUFFIX' )
+    my $suffix = Catalyst::Utils::env_value( $appname, 'CONFIG_LOCAL_SUFFIX' )
         || $c->config->{ 'Plugin::ConfigLoader' }->{ config_local_suffix }
         || 'local';
 
@@ -263,13 +273,15 @@ sub finalize_config {
 
 =head2 config_substitutions( $value )
 
-This method substitutes macros found with calls to a function. There are three
-default macros:
+This method substitutes macros found with calls to a function. There are a
+number of default macros:
 
 =over 4
 
 =item * C<__HOME__> - replaced with C<$c-E<gt>path_to('')>
 
+=item * C<__ENV(foo)__> - replaced with the value of C<$ENV{foo}>
+
 =item * C<__path_to(foo/bar)__> - replaced with C<$c-E<gt>path_to('foo/bar')>
 
 =item * C<__literal(__FOO__)__> - leaves __FOO__ alone (allows you to use
@@ -295,6 +307,17 @@ sub config_substitutions {
     my $subs = $c->config->{ 'Plugin::ConfigLoader' }->{ substitutions }
         || {};
     $subs->{ HOME }    ||= sub { shift->path_to( '' ); };
+    $subs->{ ENV }    ||=
+        sub {
+            my ( $c, $v ) = @_;
+            if (! defined($ENV{$v})) {
+                Catalyst::Exception->throw( message =>
+                    "Missing environment variable: $v" );
+                return "";
+            } else {
+                return $ENV{ $v };
+            }
+        };
     $subs->{ path_to } ||= sub { shift->path_to( @_ ); };
     $subs->{ literal } ||= sub { return $_[ 1 ]; };
     my $subsre = join( '|', keys %$subs );
@@ -319,9 +342,11 @@ development of this module:
 
 =item * David Kamholz E<lt>dkamholz@cpan.orgE<gt> - L<Data::Visitor> integration
 
+=item * Stuart Watt - Addition of ENV macro.
+
 =back
 
-Work to this module has been generously sponsored by: 
+Work to this module has been generously sponsored by:
 
 =over 4
 
@@ -331,14 +356,14 @@ Work to this module has been generously sponsored by:
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2008 by Brian Cassidy
+Copyright 2006-2010 by Brian Cassidy
 
 This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself. 
+it under the same terms as Perl itself.
 
 =head1 SEE ALSO
 
-=over 4 
+=over 4
 
 =item * L<Catalyst>