The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use inc::Module::Install;
BEGIN
{
    eval { 
        die "not testing mod_perl" unless $ENV{TEST_MODPERL};
        require mod_perl2;
        require Apache::Test;
    };
    {
        no strict 'refs';
        *HAVE_MP = $@ ? sub { 0 } : sub { 1 };
    }

    if (!$ENV{SHIPIT} && eval {
        require Moose  && Moose->VERSION(
            '0.73'
        ) && require MooseX::Types
    }) {
        *HAVE_MOOSE = sub { 1 };
    } else {
        *HAVE_MOOSE = sub { 0 };
    }
}

if (HAVE_MP) {
    require Apache::TestMM;
    Apache::TestMM->import(qw(clean test));
}

{
    no warnings 'redefine';
    *recommends_hack = $Module::Install::VERSION > 0.70 ?
        sub { recommends(@_); $_[0] } :
        \&recommends;
}

name 'HTTP-Engine';
all_from 'lib/HTTP/Engine.pm';

requires 'Any::Moose'    => '0.13';
requires 'Mouse'         => '0.62';
requires 'MouseX::Types' => '0.05';
requires 'Scalar::Util'  => 1.19;

requires 'File::Copy'       => 0;
requires 'File::Spec::Unix' => 3.2701;

requires 'CGI::Simple::Cookie' => 1.103;
requires 'HTTP::Body'          => '1.05';
requires 'HTTP::Headers::Fast' => 0.11;
requires 'URI'                 => 1.36;

# prevent tests from failing with HTTP::Server::Simple is present, but
# but the version is too old. It has no real further dependencies anyway. 
requires 'HTTP::Server::Simple' => 0.35;

features(
    'Interface::FCGI' => [
        -default => 0,
        recommends_hack('FCGI' => 0.67),
    ],

    'Interface::ServerSimple' => [
        -default => 0,
        recommends_hack('HTTP::Server::Simple' => 0.34),
    ],

    'Interface::Standalone' => [
        -default => 0,
        recommends_hack('Errno' => 1.0901),
        recommends_hack('IO::Socket::INET' => 1.31),
    ],

    'Interface::Test' => [
        -default => 0,
        recommends_hack('IO::Scalar' => 2.110),
    ],

    'Interface::POE' => [
        -default => 0,
        recommends_hack('POE' => '1.0003'),
        recommends_hack('POE::Filter::HTTPD' => 1.2387),
    ],
);

my @tests;
if (HAVE_MP) {
    Apache::TestMM::filter_args();
    Apache::TestMM::generate_script('t/TEST');
    @tests = qw( t/*.t t/*/*.t t/modperl/basic.t t/modperl/whole.t );
} else {
    @tests = qw( t/*.t t/*/*.t );
    author_tests('xt');
}

if (HAVE_MOOSE) {
    my $tests = 
        join ' ', (
            @tests,
            (map {
                my $t = $_;
                $t =~ s/(?:basic|whole).t/*.t/;
                $t =~ s{^t/}{t/moose/};
                ($t eq 't/moose/*.t' || $t eq 't/moose/modperl/*.t') ? () : $t;
            } @tests)
        );
    tests($tests);
} else {
    tests(join ' ', @tests);
}

test_requires 'YAML'; # Test::Base requires this
test_requires 'Test::More';
test_requires 'IO::Scalar';
test_requires 'File::Temp' => '0.20';
test_requires 'HTTP::Request::AsCGI';
test_requires 'Test::SharedFork' => 0.11;
test_requires 'Test::TCP' => 0.16;
test_requires 'IO::Socket' => 1.30;
test_requires 'IO::Socket::INET';
test_requires 'IO::File' => 1.14;

author_requires 'POE';
author_requires 'Net::Server::Single';
author_requires 'Moose';
author_requires 'MooseX::Types';

use_test_base;
include_deps 'Test::TCP';
auto_set_repository;
WriteAll;

# generate moose's test
if (HAVE_MOOSE) {
    $| = 1;
    print "Generating tests with Moose: this could take up to minutes ";
    my @testfiles;
    require File::Find;
    require File::Path;
    require File::Spec;

    File::Path::rmtree(File::Spec->catfile( 't', 'moose' ));

    File::Find::find(
        sub {
            return if $File::Find::dir =~ /\./ || /^\./; # skip dot directory
            return unless -f $_;

            my @dirs = File::Spec->splitpath( $File::Find::dir );
            while (!!!$dirs[0]) {
                shift @dirs;
            }
            shift @dirs;
            return if $dirs[0] eq 'xxx'; # skip to moose's test directory remover
            push @testfiles, [ $File::Find::dir, File::Spec->catfile( 't', 'moose', @dirs ), $_ ];
        }, 't'
    );

    for my $stuff (@testfiles) {
        File::Path::mkpath($stuff->[1]);

        my $from = File::Spec->catfile($stuff->[0], $stuff->[2]);
        my $to   = File::Spec->catfile($stuff->[1], $stuff->[2]);

       next if $from =~ /modperl.+post\.t$/;

        open my $from_fh, '<', $from;
        open my $to_fh, '>', $to;
        if ($to =~ /\.t$/) {
            print $to_fh "BEGIN { \$ENV{ANY_MOOSE} = 'Moose' }\n";
        }

        while (<$from_fh>) {
            print $to_fh $_;
        }
    }
    print "... done\n";
}