Youri-Config
view release on metacpan or search on metacpan
lib/Youri/Config.pm view on Meta::CPAN
All YOURI application heavily rely on plugins defined in their configuration
files. A plugin definition is composed from the following parameters:
=over
=item B<class>
The class of this plugin.
=item B<options>
The options of this plugin.
=back
=head1 SEE ALSO
YAML::AppConfig, Getopt::Long
=cut
use strict;
use warnings;
use YAML::AppConfig;
use Getopt::Long;
use File::Spec;
use Pod::Usage;
use Carp;
use version; our $VERSION = qv('0.2.4');
=head2 new(%args)
Creates and returns a new Youri::Config object.
=cut
sub new {
my ($class, %options) = @_;
# command line arguments
my $args = {
verbose => 0
};
my @args;
if ($options{args}) {
while (my ($arg, $spec) = each %{$options{args}}) {
push(@args, ($arg . $spec) => \$args->{$arg});
}
}
push(@args,
'config=s' => \$args->{config},
'h|help' => \$args->{help},
'v|verbose+' => \$args->{verbose}
);
GetOptions(@args);
if ($args->{help}) {
if (!@ARGV) {
# standard help, available immediatly
my $filename = (caller)[1];
pod2usage(
-input => $filename,
-verbose => 0
);
}
}
# config files parameters
# find configuration file to use
my $main_file;
if ($args->{config}) {
if (! -f $args->{config}) {
croak "Non-existing file $args->{config}";
} elsif (! -r $args->{config}) {
croak "Non-readable file $args->{config}";
} else {
$main_file = $args->{config};
}
} else {
foreach my $directory (@{$options{directories}}) {
my $file = "$directory/$options{file}";
next unless -f $file && -r $file;
$main_file = $file;
last;
}
}
my $params;
if ($main_file) {
eval {
$params = YAML::AppConfig->new(file => $main_file);
};
if ($@) {
croak
"Invalid configuration file $main_file, aborting. " .
"The parser error was:\n" . $@;
}
# process inclusions
my $includes = $params->get('includes');
if ($includes) {
foreach my $include_file (@{$includes}) {
# convert relative path to absolute ones
$include_file = File::Spec->rel2abs(
$include_file, (File::Spec->splitpath($main_file))[1]
);
if (! -f $include_file) {
warn "Non-existing file $include_file, skipping";
} elsif (! -r $include_file) {
warn "Non-readable file $include_file, skipping";
} else {
eval {
$params->merge(file => $include_file);
};
if ($@) {
carp "Invalid included configuration file $include_file, skipping";
}
}
( run in 1.904 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )