De-dzilify. This may look odd and borderline revolting - read on
Peter Rabbitson [Sun, 31 Jul 2011 03:28:30 +0000 (05:28 +0200)]
Currently available dzil plugins do not offer the dynconfig flexibility
that this module requires. Instead of taking a 2 day course in dzil
internals, I opted for using a tool I know to accomplish the same task.

I have absolutely no problem with someone reverting this commit and re-
doing things in dzil, as long as the resulting Makefile.PL is functionally
equivalent. Some points:

* Dzil's autorequires can't possibly understand what an optional dep is
  This is an easy fix - just specify all deps manually

* There is no plugin for "require list depending on can_cc". Package::Stash
  does something to the effect, but with some sort of hack I am not entirely
  capable of comprehending

* There is no plugin to "require list depending on smoking env", nor there
  is an easy mechanism (that I see) of combining it with the above

Makefile.PL [new file with mode: 0644]
dist.ini [deleted file]
lib/namespace/clean.pm

diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644 (file)
index 0000000..054cca9
--- /dev/null
@@ -0,0 +1,127 @@
+use strict;
+use warnings;
+use 5.008001;
+
+use ExtUtils::MakeMaker;
+
+my $mymeta_works = eval { ExtUtils::MakeMaker->VERSION('6.5707'); 1 };
+my $mymeta = $mymeta_works || eval { ExtUtils::MakeMaker->VERSION('6.5702'); 1 };
+
+my %BUILD_DEPS = (
+  'Test::More' => '0.88',
+);
+
+my %RUN_DEPS = (
+  'Package::Stash' => '0.23',
+  can_cc() ? (
+    'B::Hooks::EndOfScope' => '0.07', # when changing, also change version in namespace/clean.pm
+    is_smoker() ? ( 'Devel::Hide' => 0 ) : (),  # make sure we smoke the pure-perl version
+  ) : (),
+);
+
+my %META_BITS = (
+  resources => {
+    homepage => 'http://search.cpan.org/dist/namespace-clean',
+
+    # EUMM not supporting nested meta :(
+    #repository => {
+    #  type => 'git',
+    #  url => 'git://git.shadowcat.co.uk:p5sagit/namespace-clean.git',
+    #  web => 'http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit/namespace-clean.git',
+    #}
+    #bugtracker => {
+    #  mailto => 'bug-namespace-clean@rt.cpan.org',
+    #  web => 'http://rt.cpan.org/Public/Dist/Display.html?Name=namespace-clean',
+    #},
+
+    repository => 'git://git.shadowcat.co.uk:p5sagit/namespace-clean.git',
+    bugtracker => 'http://rt.cpan.org/Public/Dist/Display.html?Name=namespace-clean',
+  },
+);
+
+my %WriteMakefileArgs = (
+  'NAME' => 'namespace::clean',
+  'VERSION_FROM' => 'lib/namespace/clean.pm',
+  'ABSTRACT' => 'Keep imports and functions out of your namespace',
+  'AUTHOR' => 'Robert \'phaylon\' Sedlacek <rs@474.at>, Florian Ragwitz <rafl@debian.org>, Jesse Luehrs <doy@tozt.net>',
+
+  'PREREQ_PM' => {
+    %RUN_DEPS,
+    $mymeta_works ? () : (%BUILD_DEPS),
+  },
+
+  $mymeta_works
+    ? ( # BUILD_REQUIRES makes MYMETA right, requires stops META being wrong
+      'BUILD_REQUIRES' => \%BUILD_DEPS,
+      'META_ADD' => {
+        %META_BITS,
+        requires => \%RUN_DEPS,
+      },
+    )
+    : ( # META_ADD both to get META right - only Makefile written
+      'META_ADD' => {
+        %META_BITS,
+        requires => \%RUN_DEPS,
+        build_requires => \%BUILD_DEPS,
+      },
+    )
+  ,
+
+  ($mymeta and !$mymeta_works) ? ( 'NO_MYMETA' => 1 ) : (),
+
+  'LICENSE' => 'perl',
+);
+
+
+unless ( eval { ExtUtils::MakeMaker->VERSION('6.56') } ) {
+  my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
+  my $pp = $WriteMakefileArgs{PREREQ_PM};
+  for my $mod ( keys %$br ) {
+    if ( exists $pp->{$mod} ) {
+      $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
+    }
+    else {
+      $pp->{$mod} = $br->{$mod};
+    }
+  }
+}
+
+delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
+  unless eval { ExtUtils::MakeMaker->VERSION('6.52') };
+
+WriteMakefile(%WriteMakefileArgs);
+
+
+# can we locate a (the) C compiler
+sub can_cc {
+  my @chunks = split(/ /, $Config::Config{cc}) or return;
+
+  # $Config{cc} may contain args; try to find out the program part
+  while (@chunks) {
+    return can_run("@chunks") || (pop(@chunks), next);
+  }
+
+  return;
+}
+
+# check if we can run some command
+sub can_run {
+  my ($cmd) = @_;
+
+  return $cmd if -x $cmd;
+  if (my $found_cmd = MM->maybe_command($cmd)) {
+    return $found_cmd;
+  }
+
+  for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
+    next if $dir eq '';
+    my $abs = File::Spec->catfile($dir, $cmd);
+    return $abs if (-x $abs or $abs = MM->maybe_command($abs));
+  }
+
+  return;
+}
+
+sub is_smoker {
+  return ( $ENV{AUTOMATED_TESTING} && ! $ENV{PERL5_CPANM_IS_RUNNING} && ! $ENV{RELEASE_TESTING} )
+}
diff --git a/dist.ini b/dist.ini
deleted file mode 100644 (file)
index b05736a..0000000
--- a/dist.ini
+++ /dev/null
@@ -1,16 +0,0 @@
-name    = namespace-clean
-version = 0.20
-author  = Robert 'phaylon' Sedlacek <rs@474.at>
-author  = Florian Ragwitz <rafl@debian.org>
-author  = Jesse Luehrs <doy@tozt.net>
-license = Perl_5
-copyright_holder = Robert 'phaylon' Sedlacek
-
-[@FLORA]
-dist = namespace-clean
-repository_at = github
-authority = cpan:PHAYLON
-auto_prereq = 0
-
-[AutoPrereq]
-skip = ^Inheritance
index 8197618..41cd7a3 100644 (file)
@@ -7,12 +7,14 @@ use strict;
 use vars qw( $STORAGE_VAR );
 use Package::Stash;
 
+our $VERSION = '0.20';
+
 $STORAGE_VAR = '__NAMESPACE_CLEAN_STORAGE';
 
 BEGIN {
   if (eval {
     require B::Hooks::EndOfScope;
-    B::Hooks::EndOfScope->VERSION('0.07');
+    B::Hooks::EndOfScope->VERSION('0.07');  # when changing also change in Makefile.PL
     1
   } ) {
     B::Hooks::EndOfScope->import('on_scope_end');
@@ -161,7 +163,9 @@ option like this:
 If you don't care about C<namespace::clean>s discover-and-C<-except> logic, and
 just want to remove subroutines, try L</clean_subroutines>.
 
-=method clean_subroutines
+=head1 METHODS
+
+=head2 clean_subroutines
 
 This exposes the actual subroutine-removal logic.
 
@@ -245,7 +249,7 @@ sub clean_subroutines {
     $RemoveSubs->($cleanee, {}, @subs);
 }
 
-=method import
+=head2 import
 
 Makes a snapshot of the current defined functions and installs a
 L<B::Hooks::EndOfScope> hook in the current scope to invoke the cleanups.
@@ -310,7 +314,7 @@ sub import {
     }
 }
 
-=method unimport
+=head2 unimport
 
 This method will be called when you do a
 
@@ -338,7 +342,7 @@ sub unimport {
     return 1;
 }
 
-=method get_class_store
+=head2 get_class_store
 
 This returns a reference to a hash in a passed package containing
 information about function names included and excluded from removal.
@@ -354,7 +358,7 @@ sub get_class_store {
     return $stash->get_symbol($var);
 }
 
-=method get_functions
+=head2 get_functions
 
 Takes a class as argument and returns all currently defined functions
 in it as a hash reference with the function name as key and a typeglob
@@ -405,6 +409,34 @@ L<B::Hooks::EndOfScope>
 
 Many thanks to Matt S Trout for the inspiration on the whole idea.
 
+=head1 AUTHORS
+
+=over
+
+=item *
+
+Robert 'phaylon' Sedlacek <rs@474.at>
+
+=item *
+
+Florian Ragwitz <rafl@debian.org>
+
+=item *
+
+Jesse Luehrs <doy@tozt.net>
+
+=item *
+
+Peter Rabbitson <ribasushi@cpan.org>
+
+=back
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2011 by Robert 'phaylon' Sedlacek.
+
+This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
+
 =cut
 
 no warnings;