App-Config-Chronicle
view release on metacpan or search on metacpan
lib/App/Config/Chronicle.pm view on Meta::CPAN
package App::Config::Chronicle;
# ABSTRACT: Provides Data::Chronicle-backed configuration storage
use strict;
use warnings;
use Time::HiRes qw(time);
use List::Util qw(any pairs pairmap);
=head1 NAME
App::Config::Chronicle - An OO configuration module which can be changed and stored into chronicle database.
=cut
our $VERSION = '0.07';
=head1 SYNOPSIS
my $app_config = App::Config::Chronicle->new;
=head1 DESCRIPTION
This module parses configuration files and provides interface to access
configuration information.
=head1 FILE FORMAT
The configuration file is a YAML file. Here is an example:
system:
description: "Various parameters determining core application functionality"
isa: section
contains:
email:
description: "Dummy email address"
isa: Str
default: "dummy@mail.com"
global: 1
refresh:
description: "System refresh rate"
isa: Num
default: 10
global: 1
admins:
description: "Are we on Production?"
isa: ArrayRef
default: []
Every attribute is very intuitive. If an item is global, you can change its value and the value will be stored into chronicle database by calling the method C<save_dynamic>.
=head1 SUBROUTINES/METHODS (LEGACY)
=cut
use Moose;
use namespace::autoclean;
use YAML::XS qw(LoadFile);
use App::Config::Chronicle::Attribute::Section;
use App::Config::Chronicle::Attribute::Global;
use Data::Hash::DotNotation;
use Data::Chronicle::Reader;
use Data::Chronicle::Writer;
use Data::Chronicle::Subscriber;
=head2 REDIS_HISTORY_TTL
The maximum length of time (in seconds) that a cached history entry will stay in Redis.
=cut
use constant REDIS_HISTORY_TTL => 7 * 86400; # 7 days
=head2 definition_yml
The YAML file that store the configuration
=cut
has definition_yml => (
is => 'ro',
isa => 'Str',
required => 1,
);
=head2 chronicle_reader
The chronicle store that configurations can be fetch from it. It should be an instance of L<Data::Chronicle::Reader>.
But user is free to implement any storage backend he wants if it is implemented with a 'get' method.
=cut
has chronicle_reader => (
is => 'ro',
isa => 'Data::Chronicle::Reader',
required => 1,
);
=head2 chronicle_writer
The chronicle store that updated configurations can be stored into it. It should be an instance of L<Data::Chronicle::Writer>.
But user is free to implement any storage backend he wants if it is implemented with a 'set' method.
=cut
has chronicle_writer => (
is => 'rw',
isa => 'Data::Chronicle::Writer',
);
=head2 chronicle_subscriber
The chronicle connection that can notify via callbacks when particular configuration items have a new value set. It should be an instance of L<Data::Chronicle::Subscriber>.
=cut
( run in 2.454 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )