Code-TidyAll
view release on metacpan or search on metacpan
lib/Code/TidyAll.pm view on Meta::CPAN
my ($plugin_fname) = ( $plugin_name =~ /^(\S+)/ );
my $plugin_class = (
$plugin_fname =~ /^\+/
? substr( $plugin_fname, 1 )
: "Code::TidyAll::Plugin::$plugin_fname"
);
try {
use_module($plugin_class) || die 'not found';
}
catch {
die qq{could not load plugin class '$plugin_class': $_};
};
return $plugin_class->new(
name => $plugin_name,
tidyall => $self,
%$plugin_conf
);
}
sub BUILD {
my ( $self, $params ) = @_;
# Strict constructor
#
if ( my @bad_params = grep { !$self->can($_) } keys(%$params) ) {
die sprintf(
'unknown constructor param%s %s for %s',
@bad_params > 1 ? 's' : q{},
join( ', ', sort map {qq['$_']} @bad_params ),
ref($self)
);
}
unless ( $self->no_backups ) {
$self->_backup_dir->mkpath( { mode => 0775 } );
$self->_purge_backups_periodically();
}
@INC = ( @{ $self->inc }, @INC );
}
sub _purge_backups_periodically {
my ($self) = @_;
my $cache = $self->cache;
my $last_purge_backups = $cache->get('last_purge_backups') || 0;
if ( time > $last_purge_backups + $self->_backup_ttl_secs ) {
$self->_purge_backups();
$cache->set( 'last_purge_backups', time() );
}
}
sub _purge_backups {
my ($self) = @_;
$self->msg('purging old backups') if $self->verbose;
find(
{
follow => 0,
wanted => sub {
unlink $_ if -f && /\.bak$/ && time > ( stat($_) )[9] + $self->_backup_ttl_secs;
},
no_chdir => 1
},
$self->_backup_dir,
);
}
sub new_from_conf_file {
my ( $class, $conf_file, %params ) = @_;
$conf_file = path($conf_file);
die qq{no such file '$conf_file'} unless $conf_file->is_file;
my $conf_params = $class->_read_conf_file($conf_file);
my $main_params = delete( $conf_params->{'_'} ) || {};
%params = (
plugins => $conf_params,
root_dir => path($conf_file)->realpath->parent,
%{$main_params},
%params
);
# Initialize with alternate class if given
#
if ( my $tidyall_class = delete( $params{tidyall_class} ) ) {
local @INC = ( @{ $conf_params->{inc} }, @INC ) if $conf_params->{inc};
use_module($tidyall_class) or die qq{cannot load '$tidyall_class'};
$class = $tidyall_class;
}
if ( $params{verbose} ) {
my $msg_outputter = $params{msg_outputter} || $class->_build_msg_outputter();
$msg_outputter->(
'constructing %s with these params: %s', $class,
_dump_params( \%params )
);
}
return $class->new(%params);
}
sub _read_conf_file {
my ( $class, $conf_file ) = @_;
my $conf_string = $conf_file->slurp_utf8;
my $root_dir = $conf_file->parent;
$conf_string =~ s/\$ROOT/$root_dir/g;
my $conf_hash = Code::TidyAll::Config::INI::Reader->read_string($conf_string);
die qq{'$conf_file' did not evaluate to a hash}
unless ( ref($conf_hash) eq 'HASH' );
return $conf_hash;
}
sub _dump_params {
my $p = shift;
return Data::Dumper->new( [ _recurse_dump($p) ] )
->Indent(0)
->Sortkeys(1)
->Quotekeys(0)
( run in 1.317 second using v1.01-cache-2.11-cpan-483215c6ad5 )