package Perl::PrereqScanner::Scanner::DistBuild;
use strict;
use warnings;

our $VERSION = '0.002';

use Moo;
with 'Perl::PrereqScanner::Scanner';

sub scan_for_prereqs {
	my ($self, $ppi_doc, $requirements) = @_;

	# Moose-based roles / inheritance
	my @chunks =
		map  { [ $_->schildren ] }
		grep { $_->child(0)->literal =~ m{\A(?:load_module|load_extension)\z} }
		grep { $_->child(0)->isa('PPI::Token::Word') }
		@{ $ppi_doc->find('PPI::Statement') || [] };

	foreach my $hunk ( @chunks ) {
		my ($load_module, @arguments) = @$hunk;

		pop @arguments if @arguments > 1 && $arguments[-1]->isa('PPI::Token::Structure') && $arguments[-1]->content eq ';';

		if (@arguments == 1) {
			if ($arguments[0]->isa('PPI::Structure::List')) {
				@arguments = $arguments[0]->children;
			}
			if ($arguments[0]->isa("PPI::Statement::Expression")) {
				@arguments = $arguments[0]->children;
			}
		}

		my ($module_node, undef, $version_node) = grep { not $_->isa('PPI::Token::Whitespace') } @arguments;

		my ($module) = $module_node->string;

		if ($version_node) {
			$version_node->simplify if $version_node->can('simplify');
			my $version = $version_node->literal;
			$requirements->add_minimum($module, $version);
		} else {
			$requirements->add_minimum($module, 0);
		}
	}
}

1;

__END__

=pod

=encoding utf-8

=head1 NAME

Perl::PrereqScanner::Scanner::DistBuild - scan for Dist::Build dependencies

=head1 DESCRIPTION

This scanner is intended for L<Dist::Build> planner files. It recognizes C<load_extension> calls and detects the appropriate module dependency.

=head1 AUTHOR

Leon Timmermans <[email protected]>

=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.