Config-Reload

 view release on metacpan or  search on metacpan

lib/Config/Reload.pm  view on Meta::CPAN

package Config::Reload;
{
  $Config::Reload::VERSION = '0.21';
}
#ABSTRACT: Load config files, reload when files changed.

use v5.10;
use strict;

use Config::ZOMG '1.000000';

use Moo;
use Sub::Quote 'quote_sub';
use Digest::MD5 qw(md5_hex);
use Try::Tiny;

use parent 'Exporter';
our @EXPORT_OK = qw(files_hash);


has wait    => (
    is      => 'rw',
    default => quote_sub q{ 60 },
);


has checked => ( is => 'rw' );
has loaded  => ( is => 'rw' );
has error   => ( is => 'rw' );

has _md5    => ( is => 'rw' ); # caches $self->md5($self->found)
has _zomg   => ( is => 'rw', handles => [qw(find found)] );
has _config => ( is => 'rw' );

sub BUILD {
    my ($self, $given) = @_;

    # don't pass to Config::ZOMG
    delete $given->{$_} for qw(wait error checked);

    $self->_zomg( Config::ZOMG->new($given) );
}

sub load {
    my $self = shift;
    my $zomg = $self->_zomg;

    if ($self->_config) {
        if (time < $self->checked + $self->wait) {
            return $self->_config;
        }
        if ($self->_md5 eq files_hash( $zomg->find )) {
            $self->checked(time);
            return $self->_config;
        } else {
            $self->_config(undef);
        }
    }

    $self->checked(time);

    try {
        $self->error(undef);
        $self->_config( $zomg->reload ); # may die on error
        $self->loaded(time);
        $self->_md5( files_hash( $self->found ) );
    } catch {
        $self->error($_);
        $self->loaded(undef);
        $self->_md5( files_hash() );
        $self->_config( { } );
    };

    return $self->_config;
}



( run in 0.475 second using v1.01-cache-2.11-cpan-39bf76dae61 )