Footprintless
view release on metacpan or search on metacpan
lib/Footprintless/Overlay.pm view on Meta::CPAN
my $key = $self->_sub_entity('key');
push( @overlay_opts, key => $key ) if ($key);
return Template::Overlay->new( $base_dir, $self->_resolver(), @overlay_opts );
}
sub _resolver {
my ($self) = @_;
my @resolver_opts = ();
my $os = $self->_sub_entity('os');
push( @resolver_opts, os => $os ) if ($os);
my $resolver_coordinate = $self->_sub_entity('resolver_coordinate');
my $resolver_spec =
$resolver_coordinate
? $self->_entity($resolver_coordinate)
: $self->_entity();
my $resolver;
my $resolver_factory = $self->_entity('footprintless.overlay.resolver_factory');
if ($resolver_factory) {
$logger->tracef( "using resolver_factory: %s", $resolver_factory );
$resolver =
dynamic_module_new($resolver_factory)->new_resolver( $resolver_spec, @resolver_opts );
}
else {
$resolver = Template::Resolver->new( $resolver_spec, @resolver_opts );
}
return $resolver;
}
sub _resolve_footprintless {
my ( $self, $template, $footprintless_path ) = @_;
my $destination = ( File::Spec->splitpath($footprintless_path) )[1];
$logger->debugf( "resolving [%s]->[%s]", $template, $destination );
my $spec = do($template) || return;
croak("invalid $template") unless ( ref($spec) eq 'HASH' );
if ( $spec->{clean} ) {
my @to_be_cleaned =
map { File::Spec->catdir( $destination, $_ ) . ( /\/$/ ? '/' : '' ); }
ref( $spec->{clean} ) ? @{ $spec->{clean} } : ( $spec->{clean} );
Footprintless::Util::clean(
\@to_be_cleaned,
command_runner => $self->{factory}->command_runner(),
command_options => $self->_command_options()
);
}
if ( $spec->{resources} ) {
my $resource_manager = $self->{factory}->resource_manager();
foreach my $resource ( keys( %{ $spec->{resources} } ) ) {
$resource_manager->download( $spec->{resources}{$resource}, to => $destination );
}
}
}
sub update {
my ( $self, %options ) = @_;
if ( $options{to_dir} ) {
$self->_dirs_template(
$options{to_dir},
sub {
$self->_update(@_);
}
);
}
else {
$self->_local_with_dirs_template(
sub {
$self->_update(@_);
}
);
}
}
sub _update {
my ( $self, $base_dir, $template_dir, $to_dir ) = @_;
$logger->tracef( "update to=[%s], template=[%s]", $to_dir, $template_dir );
$self->_overlay($to_dir)
->overlay( $template_dir, resolver => $self->_dot_footprintless_resolver() );
}
1;
__END__
=pod
=head1 NAME
Footprintless::Overlay - An overlay manager
=head1 VERSION
version 1.29
=head1 SYNOPSIS
# Standard way of getting an overlay
use Footprintless;
my $overlay = Footprintless->new()->overlay('overlay');
$overlay->clean();
$overlay->initialize();
$overlay->update();
=head1 DESCRIPTION
Overlays are a combination of a directory of static files and a directory
of templated files that will be merged to an output directory. This
is implemented in L<Template::Overlay>.
Additionally, any folder under the C<template_dir> can contain a
C<.footprintless> file containing a C<clean> and/or C<resources> entities:
( run in 1.859 second using v1.01-cache-2.11-cpan-39bf76dae61 )