Acrux
view release on metacpan or search on metacpan
lib/Acrux/Config.pm view on Meta::CPAN
$self->{default} = shift;
return $self;
}
return $self->{default};
}
sub error {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{error} = shift;
return $self;
}
return $self->{error};
}
sub file {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{file} = shift;
return $self;
}
return $self->{file};
}
sub dirs {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{dirs} = shift;
return $self;
}
return $self->{dirs};
}
sub pointer { shift->{pointer} }
sub load {
my $self = shift;
my $opts = $self->{options};
$self->{error} = "";
# Load
my $cfg = eval { Config::General->new(%$opts) };
return $self->error(sprintf("Can't load configuration from file \"%s\": %s", $self->file, $@)) if $@;
return $self->error(sprintf("Configuration file \"%s\" did not return a Config::General object", $self->file))
unless ref $cfg eq 'Config::General';
my %config = $cfg->getall;
my @files = $cfg->files;
# Merge defaults
my $defaults = $self->default || {};
%config = (%$defaults, %config) if is_hash_ref($defaults) && scalar keys %$defaults;
# Add system values
$config{'_config_files'} = [@files];
$config{'_config_loaded'} = scalar @files;
# Set config data
$self->{config} = {%config}; # hash data
$self->pointer->data(clone($self->{config}));
return $self;
}
sub config {
my $self = shift;
my $key = shift;
return undef unless $self->{config};
return $self->{config} unless defined $key and length $key;
return $self->{config}->{$key};
}
sub conf { goto &config }
sub get {
my $self = shift;
my $key = shift;
return $self->pointer->get($key);
}
sub first {
my $self = shift;
return undef unless defined($_[0]) && length($_[0]);
my $node = $self->pointer->get($_[0]);
if (is_array_ref($node)) { # Array ref
return exists($node->[0]) ? $node->[0] : undef;
} elsif (is_value($node)) { # Scalar value
return $node;
}
return undef;
}
sub latest {
my $self = shift;
return undef unless defined($_[0]) && length($_[0]);
my $node = $self->pointer->get($_[0]);
if (is_array_ref($node)) { # Array ref
return exists($node->[0]) ? $node->[-1] : undef;
} elsif (is_value($node)) { # Scalar value
return $node;
}
return undef;
}
sub array {
my $self = shift;
return undef unless defined($_[0]) && length($_[0]);
my $node = $self->pointer->get($_[0]);
if (is_array_ref($node)) { # Array ref
return $node;
} elsif (defined($node)) {
return [$node];
}
return [];
}
sub list { goto &array }
sub hash {
my $self = shift;
return undef unless defined($_[0]) && length($_[0]);
my $node = $self->pointer->get($_[0]);
return $node if is_hash_ref($node);
return {};
}
sub object { goto &hash }
1;
__END__
( run in 0.847 second using v1.01-cache-2.11-cpan-d80b1682f3f )