The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use 5.008_001;

use Config;
use ExtUtils::MakeMaker;

BEGIN
{
    if (-d "Sandbox")
    {
        unless (grep { $_ eq "." } @INC)
        {
            use lib ".";
        }
        eval "use Sandbox::Tumble ();";
        $@ and die $@;
        eval "use File::Path ();";
        File::Path->import;
        -d 't/pureperl' and rmtree('t/pureperl');
        Sandbox::Tumble->tumble(qw(t));
    }
}

my @argv = @ARGV;
defined $ENV{PERL_MM_OPT} and push @argv, split " ", $ENV{PERL_MM_OPT};

foreach (@ARGV)
{
    /^-pm/
      and warn
      "-pm is depreciated, please use PUREPERL_ONLY=1 where applicable. For List::MoreUtils, simply don't install List::MoreUtils::XS";
    /^-xs/ and warn "-xs is depreciated, please install List::MoreUtils::XS";
    /^PUREPERL_ONLY=(.*)$/
      and warn "PUREPERL_ONLY=0|1 don't make sense, please install List::MoreUtils::XS when you need native speed";
}

my $conflictMsg = <<EOCM;
***
    This version of %s conflicts with
    the version of module %s (%s) you have installed.

    It's strongly recommended that you update it after
    installing this version of %s.
***
EOCM

my $selfConflictMsg = <<EOSCM;
***
    This version of %s conflicts with
    the version of %s (%s) you have installed.

    It's strongly recommended that you carefully read
    the Changes file and test your application with
    this version before finally upgrading.

    See local::lib how to do it easily.
***
EOSCM

# Should we build the XS version?
my %RUN_DEPS = (
    'Exporter::Tiny' => '0.038',
);
my %CONFIGURE_DEPS = (
    'ExtUtils::MakeMaker' => 0,
);
my %TEST_DEPS = (
    'Test::More' => 0.96,
);
my %CONFLICTS = (
    'List::MoreUtils'     => '0.416',
    'List::MoreUtils::PP' => '0.416',
    'List::MoreUtils::XS' => '0.416',
);

WriteMakefile1(
    META_MERGE => {
        'meta-spec' => {version => 2},
        resources   => {
            homepage   => 'https://metacpan.org/release/List-MoreUtils',
            repository => {
                url  => 'https://github.com/perl5-utils/List-MoreUtils.git',
                web  => 'https://github.com/perl5-utils/List-MoreUtils',
                type => 'git',
            },
            bugtracker => {
                web    => 'https://rt.cpan.org/Dist/Display.html?Name=List-MoreUtils',
                mailto => 'bug-List-MoreUtils@rt.cpan.org',
            },
            license => 'apache_2_0',
        },
        prereqs => {
            develop => {
                requires => {
                    'Test::CPAN::Changes'                 => 0,
                    'Test::CheckManifest'                 => 0,
                    'Module::CPANTS::Analyse'             => '0.96',
                    'Test::Kwalitee'                      => 0,
                    'Test::Pod'                           => 0,
                    'Test::Pod::Coverage'                 => 0,
                    'Test::Pod::Spelling::CommonMistakes' => 0,
                    'Test::Spelling'                      => 0,
                    'JSON::PP'                            => 0,
                    'Test::WriteVariants'                 => '0.010',
                },
            },
            configure => {requires => {%CONFIGURE_DEPS}},
            test      => {
                requires   => {%TEST_DEPS},
                recommends => {'Test::LeakTrace' => 0}
            },
            runtime => {
                requires => {%RUN_DEPS},
            },
        },
    },
    NAME         => 'List::MoreUtils',
    ABSTRACT     => 'Provide the stuff missing in List::Util',
    VERSION_FROM => 'lib/List/MoreUtils.pm',
    AUTHOR       => [
        'Tassilo von Parseval <tassilo.von.parseval@rwth-aachen.de>',
        'Adam Kennedy <adamk@cpan.org>',
        'Jens Rehsack <rehsack@cpan.org>'
    ],
    LICENSE            => 'perl',
    CONFIGURE_REQUIRES => \%CONFIGURE_DEPS,
    CONFLICTS          => \%CONFLICTS,
    PREREQ_PM          => \%RUN_DEPS,
    TEST_REQUIRES      => \%TEST_DEPS,
    (-d "Sandbox" ? (realclean => {FILES => "t/pureperl"}) : ()),
    depend => {'$(FIRST_MAKEFILE)' => '$(VERSION_FROM)'},
    test   => {TESTS               => join(' ', 't/*.t', 't/pureperl/*.t', 'xt/*.t')},
    # Otherwise 'cxinc' isn't defined
    ($] < 5.012 ? (DEFINE => '-DPERL_EXT') : (),),
);

sub CheckConflicts
{
    my %params    = @_;
    my %conflicts = %{$params{CONFLICTS}};
    my $found     = 0;
    my (@killsite, @killarch);

    while (my ($module, $version) = each(%conflicts))
    {
        undef $@;
        eval "require $module";
        next if $@;
        my $installed = eval "\$" . $module . "::VERSION";
        if ($installed le $version)
        {
            ++$found;
            my $warning =
              (0 == index($module, $params{NAME}, 0))
              ? sprintf($selfConflictMsg, $params{NAME}, $module, $installed)
              : sprintf($conflictMsg, $params{NAME}, $module, $installed, $params{NAME});
            warn $warning;
            (my $modfile = "${module}.pm") =~ s,::,/,g;
            if ($INC{$modfile} =~ m,^$Config{installsitearch},)
            {
                push @killarch, $modfile;
            }
            elsif ($INC{$modfile} =~ m,^$Config{installsitelib},)
            {
                push @killsite, "${modfile}.pm";
            }
        }
    }

    if (@killsite or @killarch)
    {
        package MY;
        no warnings 'once';

        *install = sub {
            my $self = shift;
            return join("\n",
                "\npure_site_install ::",
                (map { '	$(NOECHO) $(RM_F) ' . $self->quote_literal($self->catfile('$(DESTINSTALLSITELIB)',  $_)) } @killsite),
                (map { '	$(NOECHO) $(RM_F) ' . $self->quote_literal($self->catfile('$(DESTINSTALLSITEARCH)', $_)) } @killarch),
                $self->SUPER::install);
        };
    }

    return !$found;
}

sub WriteMakefile1
{    # originally written by Alexandr Ciornii, version 0.21. Added by eumm-upgrade.
    my %params       = @_;
    my $eumm_version = $ExtUtils::MakeMaker::VERSION;
    $eumm_version = eval $eumm_version;
    die "EXTRA_META is deprecated" if (exists($params{EXTRA_META}));
    die "License not specified"    if (!exists($params{LICENSE}));
    $params{TEST_REQUIRES}
      and $eumm_version < 6.6303
      and $params{BUILD_REQUIRES} = {%{$params{BUILD_REQUIRES} || {}}, %{delete $params{TEST_REQUIRES}}};
    #EUMM 6.5502 has problems with BUILD_REQUIRES
    $params{BUILD_REQUIRES}
      and $eumm_version < 6.5503
      and $params{PREREQ_PM} = {%{$params{PREREQ_PM} || {}}, %{delete $params{BUILD_REQUIRES}}};
    ref $params{AUTHOR}
      and "ARRAY" eq ref $params{AUTHOR}
      and $eumm_version < 6.5702
      and $params{AUTHOR} = join(", ", @{$params{AUTHOR}});
    delete $params{CONFIGURE_REQUIRES}    if ($eumm_version < 6.52);
    delete $params{MIN_PERL_VERSION}      if ($eumm_version < 6.48);
    delete $params{META_MERGE}            if ($eumm_version < 6.46);
    delete $params{META_ADD}{prereqs}     if ($eumm_version < 6.58);
    delete $params{META_ADD}{'meta-spec'} if ($eumm_version < 6.58);
    delete $params{META_ADD}              if ($eumm_version < 6.46);
    delete $params{LICENSE}               if ($eumm_version < 6.31);
    delete $params{AUTHOR}                if ($] < 5.005);
    delete $params{ABSTRACT_FROM}         if ($] < 5.005);
    delete $params{BINARY_LOCATION}       if ($] < 5.005);

    # more or less taken from SQL::Statement's Makefile.PL
    if ($params{CONFLICTS})
    {
        my $ok = CheckConflicts(%params);
        exit(0) if ($params{PREREQ_FATAL} and not $ok);
        my $cpan_smoker = grep { $_ =~ m/(?:CR_SMOKER|CPAN_REPORTER|AUTOMATED_TESTING)/ } keys %ENV;
        unless ($cpan_smoker || $ENV{PERL_MM_USE_DEFAULT})
        {
            sleep 4 unless ($ok);
        }
        delete $params{CONFLICTS};
    }

    WriteMakefile(%params);
}