The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package MyModuleBuild;

use base 'Module::Build';

use File::Spec;

# Use FatPacker to replace *.pl file with fatpacked script

sub process_script_files {
    my $self = shift;

    local *copy_if_modified = sub {
        my $self = shift;
        my %args = (@_ > 3 ? ( @_ ) : ( from => shift, to_dir => shift, flatten => shift ) );
        # Only for script/*.pl files
        if ($args{from} =~ /\bscript\/.*\.pl$/ and $args{to_dir}) {
            my (undef, undef, $file) = File::Spec->splitpath($args{from});
            $file =~ s/\.pl$//;
            $args{to} = File::Spec->catfile($args{to_dir}, $file);
            delete $args{to_dir};
            no warnings 'redefine';
            local *File::Copy::copy = sub {
                my ($file, $dest) = @_;
                open my $in,  "<", $file or die $!;
                open my $out, ">", $dest or die $!;
                local @ARGV = qw(file);
                while (<$in>) {
                    s/^__(?:END)__$/scalar(`$^X -e "use App::FatPacker -run_script" file`)/e;
                    print $out $_;
                };
                return 1;
            };
            return $self->SUPER::copy_if_modified(%args);
        };
        return $self->SUPER::copy_if_modified(%args);
    };

    $self->SUPER::process_script_files;
};

1;