package Dist::Build::DynamicPrereqs;
$Dist::Build::DynamicPrereqs::VERSION = '0.019';
use strict;
use warnings;

use parent 'ExtUtils::Builder::Planner::Extension';

sub add_methods {
	my ($self, $planner) = @_;

	$planner->add_delegate('evaluate_dynamic_prereqs', sub {
		my ($planner, %options) = @_;

		my $meta = $options{meta} // $planner->meta;

		if (my $dynamic = $meta->custom('x_dynamic_prereqs')) {
			require CPAN::Requirements::Dynamic;
			$options{config}        //= $planner->config;
			$options{pureperl_only} //= $planner->pureperl_only;

			my $dynamic_parser = CPAN::Requirements::Dynamic->new(%options);
			my $prereq = $dynamic_parser->evaluate($dynamic);
			$planner->add_meta({ prereqs => $prereq->as_string_hash });
		}
	});

	$planner->add_delegate('add_prereq', sub {
		my ($planner, $module, $version, %options) = @_;
		$version   //= 0;
		my $phase    = $options{phase}    // 'runtime';
		my $relation = $options{relation} // 'requires';

		$planner->add_meta({ prereqs => { $phase => { $relation => { $module => $version }}}});
	});
}

1;

# ABSTRACT: Support dynamic prerequisites in Dist::Build

__END__

=pod

=encoding UTF-8

=head1 NAME

Dist::Build::DynamicPrereqs - Support dynamic prerequisites in Dist::Build

=head1 VERSION

version 0.019

=head1 SYNOPSIS

 load_extension("Dist::Build::DynamicPrereqs");
 evaluate_dynamic_prereqs();

=head1 DESCRIPTION

This extension adds support for configure-time dynamic prerequisites to C<Dist::Build>.

=head1 DELEGATES

This adds the following delegates to the planner:

=head2 evaluate_dynamic_prereqs()

This evaluates the dynamic prerequisites (as L<CPAN::Requirements::Dynamic|CPAN::Requirements::Dynamic>) in the metadata, and adds them to the prerequisites.

=head2 add_prereq($module, $version = 0, %args)

This adds a specific prerequisite. It takes the following (optional) named arguments:

=over 4

=item * phase

A CPAN::Meta requirement phase: runtime (default), build or test

=item * relation

A CPAN::Meta requirement relation: requires (default, recommends or suggests

=back

=head1 AUTHOR

Leon Timmermans <fawaka@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Leon Timmermans.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut