The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package builder::MyBuilder;
use strict;
use warnings;
use utf8;
use 5.008_005;
use base qw(Module::Build::XSUtil);

sub new {
    my ($class, %args) = @_;

    $class->SUPER::new(
        %args,
        conflicts => {
            'Any::Moose',               '< 0.10',
            'MouseX::AttributeHelpers', '< 0.06',
            'MouseX::NativeTraits',     '< 1.00',
        },
        generate_ppport_h => 'ppport.h',
        generate_xshelper_h => 'xshelper.h',
        xs_files => {
            'xs-src/Mouse.xs' => 'lib/Mouse.xs',
        },
        c_source => [
            'xs-src'
        ],
        include_dirs => ['.'],
    );
}

sub ACTION_code {
    my ($self) = @_;

    system($^X, 'tool/generate-mouse-tiny.pl', 'lib/Mouse/Tiny.pm') == 0
        or warn "Cannot generate Mouse::Tiny: $!";

    open my $fh, '>', 'xs-src/xs_version.h';
    print {$fh} "#ifndef XS_VERSION\n";
    printf {$fh} "#define XS_VERSION \"%s\"\n", $self->dist_version;
    print {$fh} "#endif\n";
    close($fh);

    unless ($self->pureperl_only) {
        require ExtUtils::ParseXS;
        for my $xs (qw(
            xs-src/MouseAccessor.xs
            xs-src/MouseAttribute.xs
            xs-src/MouseTypeConstraints.xs
            xs-src/MouseUtil.xs
        )) {
            (my $c = $xs) =~ s/\.xs\z/.c/;
            print "$xs => $c\n";
            ExtUtils::ParseXS::process_file(
                filename => $xs,
                output   => $c,
            );
        }
    }

    $self->SUPER::ACTION_code();
}

sub ACTION_test {
    my ($class) = @_;

    if ($ENV{COMPAT_TEST}) {
        $class->depends_on('moose_compat_test');
    }

    if ($class->pureperl_only) {
        print "pureperl only tests.\n";
        $class->SUPER::ACTION_test();
    } else {
        {
            print "xs tests.\n";
            local $ENV{MOUSE_XS} = 1;
            $class->SUPER::ACTION_test();
        }

        {
            print "pp tests.\n";
            local $ENV{PERL_ONLY} = 1;
            $class->SUPER::ACTION_test();
        }
    }
}

sub ACTION_moose_compat_test {
    my $class = shift;

    $class->depends_on('code');

    system($^X, 'tool/create-moose-compatibility-tests.pl')
        == 0 or warn "tool/create-moose-compatibility-tests.pl: $!";
}

1;