Dist-Zilla-Plugin-DistBuild

 view release on metacpan or  search on metacpan

lib/Dist/Zilla/Plugin/DistBuild.pm  view on Meta::CPAN


use Module::Metadata;
use Moose::Util::TypeConstraints 'enum';
use MooseX::Types::Perl qw/StrictVersionStr/;
use MooseX::Types::Moose qw/Bool Str ArrayRef/;
use List::Util 1.33 qw/first any/;

sub mvp_multivalue_args { qw(header_strs footer_strs) }

sub mvp_aliases {
	+{
		header => 'header_strs',
		footer => 'footer_strs',
	}
}

around BUILDARGS => sub($orig, $class, @args) {
	my $args = $class->$orig(@args);

	my $delimiter = delete $args->{delimiter};
	if (defined $delimiter and length($delimiter)) {
		for my $arg (grep exists $args->{$_}, qw(header_strs footer_strs)) {
			s/^\Q$delimiter\E// for $args->{$arg}->@*;
		}
	}

	return $args;
};

has version_method => (
	is      => 'ro',
	isa     => enum(['installed', 'heuristic']),
	default => 'heuristic',
);

has version => (
	is      => 'ro',
	lazy    => 1,
	isa     => StrictVersionStr,
	default => sub($self) {
		if ($self->version_method eq 'installed') {
			return Module::Metadata->new_from_module('Dist::Build')->version->stringify;
		} else {
			return '0.019';
		}
	},
);

has minimum_perl => (
	is      => 'ro',
	isa     => StrictVersionStr,
	lazy    => 1,
	default => sub($self) {
		my $prereqs = $self->zilla->prereqs->cpan_meta_prereqs;
		my $reqs = $prereqs->merged_requirements([ qw/configure build test runtime/ ], ['requires']);
		return $reqs->requirements_for_module('perl') || '5.006';
	},
);

has header_strs => (
	is => 'ro', isa => ArrayRef[Str],
	traits => ['Array'],
	lazy => 1,
	default => sub { [] },
	documentation => "Additional code lines to include at the beginning of Makefile.PL",
);

has header_file => (
	is => 'ro',
	isa => Str,
	documentation => 'Additional header content to include from a file',
);

has header => (
	is            => 'ro',
	isa           => Str,
	lazy          => 1,
	builder       => '_build_header',
	documentation => "A string included at the beginning of Makefile.PL",
);

sub _build_header($self) {
	join "\n",
		$self->header_strs->@*,
		( $self->header_file
			? do {
				my $abs_file = path($self->zilla->root, $self->header_file);
				$self->log_fatal([ 'header_file %s does not exist!', $self->header_file ])
					if not $abs_file->exists;
				$abs_file->slurp_utf8
			}
			: () );
}

has footer_strs => (
	is => 'ro', isa => ArrayRef[Str],
	traits => ['Array'],
	lazy => 1,
	default => sub { [] },
	documentation => "Additional code lines to include at the end of Makefile.PL",
);

has footer_file => (
	is => 'ro',
	isa => Str,
	documentation => 'Additional footer content to include from a file',
);

has footer => (
	is            => 'ro',
	isa           => Str,
	lazy          => 1,
	builder       => '_build_footer',
	documentation => "A string included at the end of Makefile.PL",
);

sub _build_footer($self) {
	join "\n",
		$self->footer_strs->@*,
		( $self->footer_file
			? do {
				my $abs_file = path($self->zilla->root, $self->footer_file);
				$self->log_fatal([ 'footer_file %s does not exist!', $self->footer_file ])
					if not $abs_file->exists;
				$abs_file->slurp_utf8
			}
			: () );
}

has auto_configure_requires => (
	is => 'ro',
	isa => Bool,
	default => 1,
);

has auto_plugin_requires => (
	is      => 'ro',
	isa     => Bool,
	default => 0,
);

sub register_prereqs($self) {
	if ($self->auto_configure_requires) {
		$self->zilla->register_prereqs({ phase => 'configure' }, 'Dist::Build' => $self->version);
	}

	if ($self->auto_plugin_requires) {
		my @plans;
		File::Find::find(sub { push @plans, $File::Find::name if -f && /\.pl$/ }, 'planner') if -d 'planner';

		require Perl::PrereqScanner;
		require Perl::PrereqScanner::Scanner::DistBuild;
		my $scanner = Perl::PrereqScanner->new({ extra_scanners => ['DistBuild'] });
		for my $file (@plans) {
			my $prereqs = $scanner->scan_file($file);
			$prereqs->clear_requirement($_) for qw/strict warnings/;



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