Allow multiple config files, from RT#48552
[gitmo/MooseX-SimpleConfig.git] / lib / MooseX / SimpleConfig.pm
index 056bdfd..b9ea981 100644 (file)
@@ -3,34 +3,41 @@ package MooseX::SimpleConfig;
 use Moose::Role;
 with 'MooseX::ConfigFromFile';
 
-our $VERSION   = '0.03';
+our $VERSION   = '0.04';
 
 use Config::Any ();
 
 sub get_config_from_file {
     my ($class, $file) = @_;
 
+    my $files_ref = ref $file eq 'ARRAY' ? $file : [$file];
+
     my $can_config_any_args = $class->can('config_any_args');
-    my $extra_args = $can_config_any_args ? 
+    my $extra_args = $can_config_any_args ?
         $can_config_any_args->($class, $file) : {};
     ;
     my $raw_cfany = Config::Any->load_files({
-        use_ext => 1,
         %$extra_args,
-        files => [ $file ]
+        use_ext         => 1,
+        files           => $files_ref,
+        flatten_to_hash => 1,
     } );
 
-    die q{Specified configfile '} . $file
-        . q{' does not exist, is empty, or is not readable}
-            unless $raw_cfany->[0]
-                && exists $raw_cfany->[0]->{$file};
+    my %raw_config;
+    foreach my $file_tested ( @{$files_ref} ) {
+        if ( ! exists $raw_cfany->{$file_tested} ) {
+            die qq{Specified configfile '$file_tested' does not exist, } .
+                q{is empty, or is not readable};
+        }
 
-    my $raw_config = $raw_cfany->[0]->{$file};
+        my $cfany_hash = $raw_cfany->{$file_tested};
+        die "configfile must represent a hash structure in file: $file_tested"
+            unless $cfany_hash && ref $cfany_hash && ref $cfany_hash eq 'HASH';
 
-    die "configfile must represent a hash structure"
-        unless $raw_config && ref $raw_config && ref $raw_config eq 'HASH';
+        %raw_config = ( %raw_config, %{$cfany_hash} );
+    }
 
-    $raw_config;
+    \%raw_config;
 }
 
 no Moose::Role; 1;
@@ -49,45 +56,45 @@ MooseX::SimpleConfig - A Moose role for setting attributes from a simple configf
   foo: bar
   baz: 123
 
-  ## In your class 
+  ## In your class
   package My::App;
   use Moose;
-  
+
   with 'MooseX::SimpleConfig';
-  
+
   has 'foo' => (is => 'ro', isa => 'Str', required => 1);
   has 'baz'  => (is => 'rw', isa => 'Int', required => 1);
-  
+
   # ... rest of the class here
-  
+
   ## in your script
   #!/usr/bin/perl
-  
+
   use My::App;
-  
+
   my $app = My::App->new_with_config(configfile => '/etc/my_app.yaml');
   # ... rest of the script here
 
   ####################
   ###### combined with MooseX::Getopt:
 
-  ## In your class 
+  ## In your class
   package My::App;
   use Moose;
-  
+
   with 'MooseX::SimpleConfig';
   with 'MooseX::Getopt';
-  
+
   has 'foo' => (is => 'ro', isa => 'Str', required => 1);
   has 'baz'  => (is => 'rw', isa => 'Int', required => 1);
-  
+
   # ... rest of the class here
-  
+
   ## in your script
   #!/usr/bin/perl
-  
+
   use My::App;
-  
+
   my $app = My::App->new_with_options();
   # ... rest of the script here