The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Split create_distdir into several subtargets, allowing us to generate
# stuff, inject it into lib/, manifest it, and then clean all of it up
{
  package MY;
  sub distdir {
    (my $snippet = shift->SUPER::distdir(@_)) =~ s/^create_distdir :/create_distdir_copy_manifested :/;
    return <<"EOM";
$snippet

.NOTPARALLEL :

create_distdir : check_create_distdir_prereqs clonedir_generate_files clonedir_post_generate_files fresh_manifest create_distdir_copy_manifested clonedir_cleanup_generated_files
\t\$(NOECHO) \$(NOOP)

clonedir_generate_files :
\t\$(NOECHO) \$(NOOP)

clonedir_post_generate_files :
\t\$(NOECHO) \$(NOOP)

clonedir_cleanup_generated_files :
\t\$(NOECHO) \$(NOOP)

check_create_distdir_prereqs :
\t\$(NOECHO) @{[
  $mm_proto->oneliner("DBIx::Class::Optional::Dependencies->die_unless_req_ok_for(q(dist_dir))", [qw/-Ilib -MDBIx::Class::Optional::Dependencies/])
]}

EOM
  }
}

# M::I inserts its own default postamble, so we can't easily override upload
# but we can still hook postamble in EU::MM
{
  package MY;

  sub postamble {
    my $snippet = shift->SUPER::postamble(@_);
    return <<"EOM";
$snippet

upload :: check_create_distdir_prereqs check_upload_dist_prereqs

check_upload_dist_prereqs :
\t\$(NOECHO) @{[
  $mm_proto->oneliner("DBIx::Class::Optional::Dependencies->die_unless_req_ok_for(q(dist_upload))", [qw/-Ilib -MDBIx::Class::Optional::Dependencies/])
]}

EOM
  }
}

# EU::MM BUG - workaround
# somehow the init_PM of EUMM (in MM_Unix) interprets ResultClass.pod.proto
# as a valid ResultClass.pod. While this has no effect on dist-building
# it royally screws up the local Makefile.PL $TO_INST_PM and friends,
# making it impossible to make/make test from a checkout
# just rip it out here (remember - this is only executed under author mode)
{
  package MY;
  sub init_PM {
    my $self = shift;
    my $rv = $self->SUPER::init_PM(@_);
    delete @{$self->{PM}}{qw(lib/DBIx/Class/Manual/ResultClass.pod lib/DBIx/Class/Manual/ResultClass.pod.proto)};
    $rv
  }
}

# make the install (and friends) target a noop - instead of
# doing a perl Makefile.PL && make && make install (which will leave pod
# behind), one ought to assemble a distdir first

{
  package MY;
  sub install {
    (my $snippet = shift->SUPER::install(@_))
      =~ s/^( (?: install [^\:]+ | \w+_install \s) \:+ )/$1 block_install_from_checkout/mxg;
    return <<"EOM";
$snippet

block_install_from_checkout :
\t\$(NOECHO) \$(ECHO) Installation directly from a checkout is not possible. You need to prepare a distdir, enter it, and run the installation from within.
\t\$(NOECHO) \$(FALSE)

EOM
  }
}

# keep the Makefile.PL eval happy
1;