add conflict checking to the generated Makefile.PL
Jesse Luehrs [Wed, 27 Oct 2010 16:54:37 +0000 (11:54 -0500)]
.gitignore
dist.ini
inc/MMPackageStash.pm [new file with mode: 0644]

index a2bd8da..478a475 100644 (file)
@@ -2,7 +2,6 @@ cover_db
 META.yml
 Makefile
 blib
-inc
 pm_to_blib
 MANIFEST
 Makefile.old
index ab24035..35c87e7 100644 (file)
--- a/dist.ini
+++ b/dist.ini
@@ -5,6 +5,7 @@ copyright_holder = Jesse Luehrs
 
 [@DOY]
 dist = Package-Stash
+awesome = =inc::MMPackageStash
 
 [Prereq]
 Scalar::Util = 0
diff --git a/inc/MMPackageStash.pm b/inc/MMPackageStash.pm
new file mode 100644 (file)
index 0000000..a067fc7
--- /dev/null
@@ -0,0 +1,59 @@
+package inc::MMPackageStash;
+use Moose;
+
+extends 'Dist::Zilla::Plugin::MakeMaker::Awesome';
+
+# XXX: this is pretty gross, it should be possible to clean this up later
+around _build_MakeFile_PL_template => sub {
+    my $orig = shift;
+    my $self = shift;
+    my $template = $self->$orig(@_);
+
+    $template =~ s/(use ExtUtils::MakeMaker.*)/$1\n\ncheck_conflicts();/;
+
+    $template .= <<'CHECK_CONFLICTS';
+sub check_conflicts {
+    my %conflicts = (
+        'Class::MOP' => '1.09',
+    );
+    my $found = 0;
+    for my $mod ( sort keys %conflicts ) {
+        eval "require $mod";
+        next if $@;
+
+        my $installed = $mod->VERSION();
+        if ( $installed le $conflicts{$mod} ) {
+
+            print <<"EOF";
+
+***
+    This version of Package::Stash conflicts with the version of
+    $mod ($installed) you have installed.
+
+    You will need to upgrade $mod after installing
+    this version of Package::Stash.
+***
+
+EOF
+
+            $found = 1;
+        }
+    }
+
+    return unless $found;
+
+    # More or less copied from Module::Build
+    return if  $ENV{PERL_MM_USE_DEFAULT};
+    return unless -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT));
+
+    sleep 4;
+}
+CHECK_CONFLICTS
+
+    return $template;
+};
+
+__PACKAGE__->meta->make_immutable;
+no Moose;
+
+1;