Config-FromHash
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Config/FromHash.pm view on Meta::CPAN
use strict;
use warnings;
use 5.10.1;
package Config::FromHash;
our $VERSION = '0.0800'; # VERSION
# ABSTRACT: Read config files containing hashes
use File::Basename();
use Hash::Merge();
use Path::Tiny;
sub new {
my($class, %args) = @_;
$args{'data'} ||= {};
$args{'sep'} ||= qr{/};
$args{'require_all_files'} ||= 0;
$args{'config_files'} = [];
if(exists $args{'filename'} && exists $args{'filenames'}) {
die "Don't use both 'filename' and 'filenames'.";
}
if(exists $args{'environment'} && exists $args{'environments'}) {
die "Don't use both 'environment' and 'environments'.";
}
$args{'filenames'} = $args{'filename'} if exists $args{'filename'};
$args{'environments'} = $args{'environment'} if exists $args{'environment'};
if(exists $args{'filenames'}) {
if(ref $args{'filenames'} ne 'ARRAY') {
$args{'filenames'} = [ $args{'filenames'} ];
}
}
else {
$args{'filenames'} = [];
}
if(exists $args{'environments'}) {
if(ref $args{'environments'} ne 'ARRAY') {
$args{'environments'} = [ $args{'environments'} ];
}
}
else {
$args{'environments'} = [ undef ];
}
my $self = bless \%args => $class;
Hash::Merge::set_behavior('LEFT_PRECEDENT');
if(scalar @{ $args{'filenames'} }) {
foreach my $environment (reverse @{ $args{'environments'} }) {
FILE:
foreach my $config_file (reverse @{ $args{'filenames'} }) {
my($filename, $directory, $extension) = File::Basename::fileparse($config_file, qr{\.[^.]+$});
my $new_filename = $directory . $filename . (defined $environment ? ".$environment" : '') . $extension;
if(!-e $new_filename) {
die "$new_filename does not exist" if $self->require_all_files;
next FILE;
}
push @{ $args{'config_files'} } => $new_filename;
$args{'data'} = Hash::Merge::merge($self->parse($new_filename, $args{'data'}));
}
}
}
return $self;
}
sub data {
return shift->{'data'};
}
sub get {
my $self = shift;
my $path = shift;
if(!defined $path) {
warn "No path defined - nothing to return";
return;
}
my @parts = split $self->{'sep'} => $path;
my $hash = $self->{'data'};
foreach my $part (@parts) {
if(ref $hash eq 'HASH') {
$hash = $hash->{ $part };
}
else {
die "Can't resolve path '$path' to '$part'";
}
}
return $hash;
}
sub config_files {
my $self = shift;
return @{ $self->{'config_files'} };
}
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.928 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )