The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changes 09
META.yml 78
Makefile.PL 816
README 28
inc/Class/Inspector.pm 4593
inc/ExtUtils/AutoInstall.pm 97
inc/Module/Install/AutoInstall.pm 144
inc/Module/Install.pm 11
lib/Test/Inline/Content/Default.pm 44
lib/Test/Inline/Content/Legacy.pm 55
lib/Test/Inline/Content/Simple.pm 77
lib/Test/Inline/Content.pm 33
lib/Test/Inline/Extract.pm 78
lib/Test/Inline/IO/File/VCS.pm 44
lib/Test/Inline/IO/File.pm 21
lib/Test/Inline/Script.pm 911
lib/Test/Inline/Section.pm 44
lib/Test/Inline/Util.pm 22
lib/Test/Inline.pm 1016
t/05_check_count.t 1111
t/11_legacy_script.t 11
t/12_content_handler.t 3232
t/99_pod.t 031
23 files changed (This is a version diff) 187286
@@ -1,5 +1,14 @@
 Revision history for Perl extension Test::Inline
 
+2.101    Tue Sep 13 2005
+	- Rebuilding to synchronize with new Module::Install and
+	  ExtUtils::AutoInstall
+	- Tweaks the per-section test code to make more applicable value
+	  appear in the failure summary.
+	- Removed all remaining use of UNIVERSAL::isa, switching to a
+	  more accurate Params::Util approach. Should allow for improved
+	  extensibility.
+
 2.100    Thu Jul 14 2005
 	- Worked as good as I hoped, moving to production release
 	- Bundling a couple of build-time-only deps
@@ -1,7 +1,7 @@
 name: Test-Inline
-version: 2.100
+version: 2.101
 abstract: Inlining your tests next to the code being tested
-author: Adam Kennedy<adam@ali.as>
+author: Adam Kennedy <adam@ali.as>
 license: unknown
 distribution_type: module
 build_requires:
@@ -9,17 +9,18 @@ build_requires:
   Test::ClassAPI: 1.02
 requires:
   perl: 5.005
-  File::Spec: 0.82
+  File::Spec: 0.80
   List::Util: 1.11
+  Getopt::Long: 2.34
   File::Slurp: 9999.04
   File::Find::Rule: 0.26
-  Algorithm::Dependency: 1.02
+  Config::Tiny: 2.00
+  Params::Util: 0.05
   Class::Autouse: 1.15
+  Algorithm::Dependency: 1.02
   File::Flat: 0.95
-  Config::Tiny: 2.00
-  Getopt::Long: 2.34
 no_index:
   directory:
     - t.data
     - inc
-generated_by: Module::Install version 0.36
+generated_by: Module::Install version 0.37
@@ -1,27 +1,35 @@
 use inc::Module::Install;
 
+# Generate configuration
 name           ( 'Test-Inline'                        );
 abstract       ( 'Inlining your tests next to the code being tested' );
-author         ( 'Adam Kennedy<adam@ali.as>'          );
+author         ( 'Adam Kennedy <adam@ali.as>'         );
 version_from   ( 'lib/Test/Inline.pm'                 );
 requires       ( 'perl'                  => '5.005'   );
-requires       ( 'File::Spec'            => '0.82'    );
+
+# Other people's CPAN modules
+requires       ( 'File::Spec'            => '0.80'    );
 requires       ( 'List::Util'            => '1.11'    );
+requires       ( 'Getopt::Long'          => '2.34'    );
 requires       ( 'File::Slurp'           => '9999.04' );
 requires       ( 'File::Find::Rule'      => '0.26'    );
-requires       ( 'Algorithm::Dependency' => '1.02'    );
+
+# My CPAN modules
+requires       ( 'Config::Tiny'          => '2.00'    );
+requires       ( 'Params::Util'          => '0.05'    );
 requires       ( 'Class::Autouse'        => '1.15'    );
+requires       ( 'Algorithm::Dependency' => '1.02'    );
 requires       ( 'File::Flat'            => '0.95'    );
-requires       ( 'Config::Tiny'          => '2.00'    );
-requires       ( 'Getopt::Long'          => '2.34'    );
+
+# Testing modules (bundled where appropriate)
 build_requires ( 'Test::More'            => '0.47'    );
 build_requires ( 'Test::ClassAPI'        => '1.02'    );
-include        ( 'ExtUtils::AutoInstall'              );
 include        ( 'Test::ClassAPI'                     );
 include        ( 'Class::Inspector'                   );
+
+# Miscellaneous items
 install_script ( 'bin/inline2test'                    );
 no_index       ( directory               => 't.data'  );
-
-auto_install();
+auto_install   (                                      );
 
 &WriteAll;
@@ -6,7 +6,7 @@ DESCRIPTION
 
     This is a nice supplement to the traditional .t files.
 
-    It's like XUnit, Perl-style.
+    It's like XUnit, only better and Perl-style.
 
   How does it work?
     "Test::Inline" lets you write small fragments of general or
@@ -20,7 +20,7 @@ DESCRIPTION
       ok( -f /proc/cpuinfo, 'Host has a standard /proc/cpuinfo file' );
   
       =end testing
-
+  
       # Completely test a single method
   
       =begin testing label
@@ -243,6 +243,12 @@ METHODS
 
     Returns the number of test files generated. Returns "undef" on error.
 
+BUGS
+    The "Extended =begin" syntax used for non-trivial sections is not really
+    considered part of the spec yet. While simple '=begin testing' sections
+    are find and will pass POD testing, extended begin sections may cause
+    POD errors.
+
 TO DO
     - Add support for "example" sections
 
@@ -1,30 +1,24 @@
 #line 1 "inc/Class/Inspector.pm - /usr/local/share/perl/5.8.4/Class/Inspector.pm"
 package Class::Inspector;
 
-# Class::Inspector contains a range of static methods that can be used
-# to get information about a class ( or package ) in a convient way.
-
-# In this module we use $class to refer to OUR class, and $name to
-# refer to class names being passed to us to be acted upon.
-#
-# Almost everything in here can be done in other ways, but a lot
-# involve playing with special varables, symbol table, and the like.
+#line 41
 
 # Load Overhead: 236k
 
 # We don't want to use strict refs, since we do a lot of things in here
 # that arn't strict refs friendly.
-use strict 'vars', 'subs';
+use strict     'vars',
+               'subs';
 use File::Spec ();
 
 # Globals
-use vars qw{$VERSION $RE_SYMBOL $RE_CLASS $UNIX};
+use vars qw{$VERSION $RE_IDENT $RE_CLASS $UNIX};
 BEGIN {
-	$VERSION = '1.08';
+	$VERSION = '1.12';
 
 	# Predefine some regexs
-	$RE_SYMBOL  = qr/\A[^\W\d]\w*\z/;
-	$RE_CLASS   = qr/\A[^\W\d]\w*(?:(?:'|::)[^\W\d]\w*)*\z/;
+	$RE_IDENT = qr/\A[^\W\d]\w*\z/s;
+	$RE_CLASS = qr/\A[^\W\d]\w*(?:(?:'|::)[^\W\d]\w*)*\z/s;
 
 	# Are we on Unix?
 	$UNIX = !! ( $File::Spec::ISA[0] eq 'File::Spec::Unix' );
@@ -37,21 +31,23 @@ BEGIN {
 #####################################################################
 # Basic Methods
 
-# Is the class installed on the machine, or rather, is it available
-# to Perl. This is basically just a wrapper around C<resolved_filename>.
-# It is installed if it is either already available in %INC, or we
-# can resolve a filename for it.
+#line 82
+
 sub installed {
 	my $class = shift;
 	!! ($class->loaded_filename($_[0]) or $class->resolved_filename($_[0]));
 }
 
-# Is the class loaded.
-# We do this by seeing if the namespace is "occupied", which basically
-# means either we can find $VERSION or @ISA, or at least one subroutine.
+#line 106
+
 sub loaded {
 	my $class = shift;
-	my $name = $class->_class(shift) or return undef;
+	my $name  = $class->_class(shift) or return undef;
+	$class->_loaded($name);
+}
+
+sub _loaded {
+	my ($class, $name) = @_;
 
 	# Handle by far the two most common cases
 	# This is very fast and handles 99% of cases.
@@ -72,18 +68,19 @@ sub loaded {
 	'';
 }
 
-# Convert to a filename, in the style of
-# First::Second -> First/Second.pm
+#line 152
+
 sub filename {
 	my $class = shift;
-	my $name = $class->_class(shift) or return undef;
+	my $name  = $class->_class(shift) or return undef;
 	File::Spec->catfile( split /(?:'|::)/, $name ) . '.pm';
 }
 
-# Resolve the full filename for the class.
+#line 178
+
 sub resolved_filename {
-	my $class = shift;
-	my $filename = $class->_inc_filename(shift) or return undef;
+	my $class     = shift;
+	my $filename  = $class->_inc_filename(shift) or return undef;
 	my @try_first = @_;
 
 	# Look through the @INC path to find the file
@@ -97,10 +94,10 @@ sub resolved_filename {
 	'';
 }
 
-# Get the loaded filename for the class.
-# Look the base filename up in %INC
+#line 207
+
 sub loaded_filename {
-	my $class = shift;
+	my $class    = shift;
 	my $filename = $class->_inc_filename(shift);
 	$UNIX ? $INC{$filename} : $class->_inc_to_local($INC{$filename});
 }
@@ -112,24 +109,22 @@ sub loaded_filename {
 #####################################################################
 # Sub Related Methods
 
-# Get a reference to a list of function names for a class.
-# Note: functions NOT methods.
-# Only works if the class is loaded
+#line 234
+
 sub functions {
 	my $class = shift;
 	my $name  = $class->_class(shift) or return undef;
 	return undef unless $class->loaded( $name );
 
 	# Get all the CODE symbol table entries
-	my @functions = sort grep { /$RE_SYMBOL/o }
+	my @functions = sort grep { /$RE_IDENT/o }
 		grep { defined &{"${name}::$_"} }
 		keys %{"${name}::"};
 	\@functions;
 }
 
-# As above, but returns a ref to an array of the actual 
-# CODE refs of the functions.
-# The class must be loaded for this to work.
+#line 260
+
 sub function_refs {
 	my $class = shift;
 	my $name  = $class->_class(shift) or return undef;
@@ -138,13 +133,14 @@ sub function_refs {
 	# Get all the CODE symbol table entries, but return
 	# the actual CODE refs this time.
 	my @functions = map { \&{"${name}::$_"} }
-		sort grep { /$RE_SYMBOL/o }
+		sort grep { /$RE_IDENT/o }
 		grep { defined &{"${name}::$_"} }
 		keys %{"${name}::"};
 	\@functions;
 }
 
-# Does a particular function exist
+#line 289
+
 sub function_exists {
 	my $class    = shift;
 	my $name     = $class->_class( shift ) or return undef;
@@ -157,7 +153,8 @@ sub function_exists {
 	defined &{"${name}::$function"};
 }
 
-# Get all the available methods for the class
+#line 368
+
 sub methods {
 	my $class     = shift;
 	my $name      = $class->_class( shift ) or return undef;
@@ -213,7 +210,7 @@ sub methods {
 	my %methods = ();
 	foreach my $namespace ( @path ) {
 		my @functions = grep { ! $methods{$_} }
-			grep { /$RE_SYMBOL/o }
+			grep { /$RE_IDENT/o }
 			grep { defined &{"${namespace}::$_"} } 
 			keys %{"${namespace}::"};
 		foreach ( @functions ) {
@@ -224,7 +221,7 @@ sub methods {
 	# Filter to public or private methods if needed
 	my @methodlist = sort keys %methods;
 	@methodlist = grep { ! /^\_/ } @methodlist if $options{public};
-	@methodlist = grep { /^\_/ }   @methodlist if $options{private};
+	@methodlist = grep {   /^\_/ } @methodlist if $options{private};
 
 	# Return in the correct format
 	@methodlist = map { "$methods{$_}::$_" } @methodlist if $options{full};
@@ -240,6 +237,59 @@ sub methods {
 
 
 #####################################################################
+# Search Methods
+
+#line 469
+
+sub subclasses {
+	my $class = shift;
+	my $name  = $class->_class( shift ) or return undef;
+
+	# Prepare the search queue
+	my @found = ();
+	my @queue = grep { $_ ne 'main' } $class->_subnames('');
+	while ( @queue ) {
+		my $c = shift(@queue); # c for class
+		if ( $class->_loaded($c) ) {
+			# At least one person has managed to misengineer
+			# a situation in which ->isa could die, even if the
+			# class is real. Trap these cases and just skip
+			# over that (bizarre) class. That would at limit
+			# problems with finding subclasses to only the
+			# modules that have broken ->isa implementation.
+			eval {
+				if ( $c->isa($name) ) {
+					# Add to the found list, but don't add the class itself
+					push @found, $c unless $c eq $name;
+				}
+			};
+		}
+
+		# Add any child namespaces to the head of the queue.
+		# This keeps the queue length shorted, and allows us
+		# not to have to do another sort at the end.
+		unshift @queue, map { "${c}::$_" } $class->_subnames($c);
+	}
+
+	@found ? \@found : '';
+}
+
+sub _subnames {
+	my ($class, $name) = @_;
+	return sort
+		grep {
+			substr($_, -2, 2, '') eq '::'
+			and
+			/$RE_IDENT/o
+		}
+		keys %{"${name}::"};
+}
+
+
+
+
+
+#####################################################################
 # Children Related Methods
 
 # These can go undocumented for now, until I decide if its best to
@@ -320,6 +370,4 @@ sub _inc_to_local {
 
 1;
 
-__END__
-
-#line 509
+#line 632
@@ -1,15 +1,12 @@
 #line 1 "inc/ExtUtils/AutoInstall.pm - /usr/local/share/perl/5.8.4/ExtUtils/AutoInstall.pm"
-# $File: //member/autrijus/ExtUtils-AutoInstall/lib/ExtUtils/AutoInstall.pm $ 
-# $Revision: #14 $ $Change: 10538 $ $DateTime: 2004/04/29 17:55:36 $ vim: expandtab shiftwidth=4
-
 package ExtUtils::AutoInstall;
-$ExtUtils::AutoInstall::VERSION = '0.61';
+$ExtUtils::AutoInstall::VERSION = '0.62';
 
 use strict;
 use Cwd ();
 use ExtUtils::MakeMaker ();
 
-#line 308
+#line 305
 
 # special map on pre-defined feature sets
 my %FeatureMap = (
@@ -357,8 +354,10 @@ sub _install_cpan {
     my %args;
 
     require CPAN; CPAN::Config->load;
+    require Config;
 
-    return unless _can_write(MM->catfile($CPAN::Config->{cpan_home}, 'sources'));
+    return unless _can_write(MM->catfile($CPAN::Config->{cpan_home}, 'sources'))
+              and _can_write($Config::Config{sitelib});
 
     # if we're root, set UNINST=1 to avoid trouble unless user asked for it.
     my $makeflags = $CPAN::Config->{make_install_arg} || '';
@@ -488,8 +487,7 @@ sub _can_write {
     my $path = shift;
     mkdir ($path, 0755) unless -e $path;
 
-    require Config;
-    return 1 if -w $path and -w $Config::Config{sitelib};
+    return 1 if -w $path;
 
     print << ".";
 *** You are not allowed to write to the directory '$path';
@@ -646,4 +644,4 @@ installdeps ::
 
 __END__
 
-#line 973
+#line 971
@@ -18,20 +18,6 @@ sub auto_install {
     my $self = shift;
     return if $self->{done}++;
 
-# ExtUtils::AutoInstall Bootstrap Code, version 7.
-AUTO:{my$p='ExtUtils::AutoInstall';my$v=0.49;$p->VERSION||0>=$v
-or+eval"use $p $v;1"or+do{my$e=$ENV{PERL_EXTUTILS_AUTOINSTALL};
-(!defined($e)||$e!~m/--(?:default|skip|testonly)/and-t STDIN or
-eval"use ExtUtils::MakeMaker;WriteMakefile(PREREQ_PM=>{'$p',$v}
-);1"and exit)and print"==> $p $v required. Install it from CP".
-"AN? [Y/n] "and<STDIN>!~/^n/i and print"*** Installing $p\n"and
-do{if (eval '$>' and lc(`sudo -V`) =~ /version/){system('sudo',
-$^X,"-MCPANPLUS","-e","CPANPLUS::install $p");eval"use $p $v;1"
-||system('sudo', $^X, "-MCPAN", "-e", "CPAN::install $p")}eval{
-require CPANPLUS;CPANPLUS::install$p};eval"use $p $v;1"or eval{
-require CPAN;CPAN::install$p};eval"use $p $v;1"||die"*** Please
-manually install $p $v from cpan.org first...\n"}}}
-
     # Flatten array of arrays into a single array
     my @core = map @$_, map @$_, grep ref,
                $self->build_requires, $self->requires;
@@ -40,6 +26,10 @@ manually install $p $v from cpan.org first...\n"}}}
         push @core, splice(@_, 0, 2);
     }
 
+    # We'll need ExtUtils::AutoInstall
+    $self->include('ExtUtils::AutoInstall');
+    require ExtUtils::AutoInstall;
+
     ExtUtils::AutoInstall->import(
         (@core ? (-core => \@core) : ()), @_, $self->features
     );
@@ -1,6 +1,6 @@
 #line 1 "inc/Module/Install.pm - /usr/local/share/perl/5.8.4/Module/Install.pm"
 package Module::Install;
-$VERSION = '0.36';
+$VERSION = '0.37';
 
 die << "." unless $INC{join('/', inc => split(/::/, __PACKAGE__)).'.pm'};
 Please invoke ${\__PACKAGE__} with:
@@ -16,18 +16,18 @@ This module contains no user servicable parts.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
 use base 'Test::Inline::Content';
+use Params::Util qw{_INSTANCE};
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 sub process {
 	my $self   = shift;
-	my $Inline = isa(ref $_[0], 'Test::Inline')         ? shift : return undef;
-	my $Script = isa(ref $_[0], 'Test::Inline::Script') ? shift : return undef;
+	my $Inline = _INSTANCE(shift, 'Test::Inline')         or return undef;
+	my $Script = _INSTANCE(shift, 'Test::Inline::Script') or return undef;
 
 	# Get the merged content
 	my $content = $Script->merged_content;
@@ -51,12 +51,12 @@ The synopsis above pretty much says all you need to know.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
 use base 'Test::Inline::Content';
+use Params::Util qw{_CODE _INSTANCE};
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 =pod
@@ -75,7 +75,7 @@ passed a C<CODE> reference.
 sub new {
 	my $class = ref $_[0] ? ref shift : shift;
 	my $self  = $class->SUPER::new(@_);
-	$self->{coderef} = ref $_[0] eq 'CODE' ? shift : return undef;
+	$self->{coderef} = _CODE(shift) or return undef;
 	$self;
 }
 
@@ -101,8 +101,8 @@ to the legacy function, and returning it's result as the return value.
 
 sub process {
 	my $self   = shift;
-	my $Inline = isa(ref $_[0], 'Test::Inline')         ? shift : return undef;
-	my $Script = isa(ref $_[0], 'Test::Inline::Script') ? shift : return undef;
+	my $Inline = _INSTANCE(shift, 'Test::Inline')         or return undef;
+	my $Script = _INSTANCE(shift, 'Test::Inline::Script') or return undef;
 
 	# Pass through the params, pass back the result
 	$self->coderef->( $Inline, $Script );	
@@ -44,13 +44,13 @@ The C<tests> tag will be replaced by the actual testing code.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
 use base 'Test::Inline::Content';
-use File::Slurp ();
+use File::Slurp  ();
+use Params::Util qw{_INSTANCE};
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 
@@ -80,8 +80,8 @@ sub new {
 
 	# Load, check and add the file
 	my $template = File::Slurp::read_file( $file ) or return undef;
-	$template =~ /\[%\s+tests\s+\%\]/           or return undef;
-	$template =~ /\[\%\s+plan\s+\%\]/            or return undef;
+	$template =~ /\[%\s+tests\s+\%\]/              or return undef;
+	$template =~ /\[\%\s+plan\s+\%\]/              or return undef;
 	$self->{template} = $template;
 
 	$self;
@@ -114,8 +114,8 @@ The C<process> method is unchanged from C<Test::Inline::Content>.
 
 sub process {
 	my $self   = shift;
-	my $Inline = isa(ref $_[0], 'Test::Inline')         ? shift : return undef;
-	my $Script = isa(ref $_[0], 'Test::Inline::Script') ? shift : return undef;
+	my $Inline = _INSTANCE(shift, 'Test::Inline')         or return undef;
+	my $Script = _INSTANCE(shift, 'Test::Inline::Script') or return undef;
 
 	# Get the merged content
 	my $content = $Script->merged_content;
@@ -19,7 +19,7 @@ extensions can be written to control the content of the generated scripts.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
+use Params::Util '_INSTANCE';
 
 use vars qw{$VERSION};
 BEGIN {
@@ -59,8 +59,8 @@ Returns the content of the script as a string, or C<undef> on error.
 
 sub process {
 	my $self   = shift;
-	my $Inline = isa(ref $_[0], 'Test::Inline')         ? shift : return undef;
-	my $Script = isa(ref $_[0], 'Test::Inline::Script') ? shift : return undef;
+	my $Inline = _INSTANCE(shift, 'Test::Inline')         or return undef;
+	my $Script = _INSTANCE(shift, 'Test::Inline::Script') or return undef;
 
 	# If used directly, create a valid script file that just dies
 	my $class   = $Script->class;
@@ -17,12 +17,13 @@ L<Test::Inline> from source files.
 =cut
 
 use strict;
-use List::Util  ();
-use File::Slurp ();
+use List::Util   ();
+use File::Slurp  ();
+use Params::Util qw{_CLASS _INSTANCE _SCALAR};
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 
@@ -45,7 +46,7 @@ Returns a new C<Test::Inline::Extract> object or C<undef> on error.
 =cut
 
 sub new {
-	my $class  = ref $_[0] ? die '->new is a static method' : shift;
+	my $class  = _CLASS(shift) or die '->new is a static method';
 
 	# Get the source code to process, and clean it up
 	my $source = $class->_source(shift) or return undef;
@@ -64,8 +65,8 @@ sub new {
 sub _source {
 	my $self = shift;
 	return undef unless defined $_[0];
-	return shift if ref $_[0] eq 'SCALAR';
-	return undef if ref $_[0];
+	return shift if     _SCALAR($_[0]);
+	return undef if     ref $_[0];
 	File::Slurp::read_file( shift, scalar_ref => 1 );
 }
 
@@ -118,7 +119,7 @@ sub elements {
 }
 
 sub _elements {
-	my $self = shift;
+	my $self     = shift;
 	my @elements = ();
 	while ( $self->{source} =~ m/$search/go ) {
 		push @elements, $1;
@@ -11,9 +11,9 @@ Test::Inline::IO::File::VCS - Test::Inline IO Handler for Version Control System
 This class implements a L<Test::Inline> 2 IO Handler for outputing test
 files into trees of directories checkout out from a version control system.
 
-This class is intended for release with Test::Inline 2.100, and if you are
-seeing this it probably got accidentally rolled up by the author's automated
-release dist builder script.
+This class is intended for release with a future L<Test::Inline> release,
+and if you are seeing this it probably got accidentally rolled up by the
+author's automated release dist builder script.
 
 Please ignore this class for the time being.
 
@@ -27,7 +27,7 @@ use base 'Test::Inline::IO::File';
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 
@@ -32,13 +32,12 @@ underlying filesystem if required.
 
 use strict;
 use File::Spec ();
-use UNIVERSAL 'isa';
 use Class::Autouse 'File::Flat',
                    'File::Find::Rule';
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 
@@ -18,8 +18,8 @@ and then merge them into a test file.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
-use List::Util ();
+use List::Util   ();
+use Params::Util qw{_ARRAY _INSTANCE};
 use Algorithm::Dependency::Ordered;
 use base 'Algorithm::Dependency::Source',
          'Algorithm::Dependency::Item';
@@ -28,7 +28,7 @@ use overload 'bool' => sub () { 1 },
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 # Special case, for when doing unit tests ONLY.
@@ -61,8 +61,8 @@ Returns C<undef> on error.
 
 sub new {
 	my $class       = shift;
-	my $_class      = defined $_[0]        ? shift : return undef;
-	my $Sections    = ref $_[0] eq 'ARRAY' ? shift : return undef;
+	my $_class      = defined $_[0] ? shift : return undef;
+	my $Sections    = _ARRAY(shift) or return undef;
 	my $check_count = shift || 0;
 
 	# Create the object
@@ -297,7 +297,7 @@ sub merged_content {
 # in the standard boilerplate.
 sub _wrap_content {
 	my $self    = shift;
-	my $Section = isa($_[0], 'Test::Inline::Section') ? shift : return undef;
+	my $Section = _INSTANCE(shift, 'Test::Inline::Section') or return undef;
 	my $code    = $Section->content;
 
 	# Wrap in compilation test code if an example
@@ -327,8 +327,8 @@ sub _wrap_content {
 		my $section  = 
 		$code = "\$::__tc = Test::Builder->new->current_test;\n"
 		      . $code
-		      . "is( Test::Builder->new->current_test, \$::__tc"
-		        . ($increase ? " + $increase" : '')
+		      . "is( Test::Builder->new->current_test - \$::__tc, "
+		        . ($increase || '0')
 		        . ",\n"
 		      . "\t'$increase $were run in the section' );\n";
 	}
@@ -378,7 +378,9 @@ sub id {
 
 sub depends {
 	my $self = shift;
-	my %depends = map { $_ => 1 } map { $_->classes } ($self->setup, $self->sections);
+	my %depends = map { $_ => 1     }
+	              map { $_->classes }
+	              ($self->setup, $self->sections);
 	keys %depends;	
 }
 
@@ -96,13 +96,13 @@ order of appearance.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
 use base 'Algorithm::Dependency::Item';
-use List::Util ();
+use List::Util   ();
+use Params::Util qw{_ARRAY};
 
 use vars qw{$VERSION $errstr};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 	$errstr  = '';
 }
 
@@ -357,7 +357,7 @@ and set it in the Sections.
 sub parse {
 	$errstr      = '';
 	my $class    = shift;
-	my $elements = ref $_[0] eq 'ARRAY' ? shift : return undef;
+	my $elements = _ARRAY(shift) or return undef;
 	my @Sections = ();
 
 	# Iterate over the elements and maintain package contexts
@@ -1,5 +1,5 @@
 # This is an inlined version of the private Phase N module File::DirUtils,
-# approved for use only in it's inline state as Test::Inline::Util.
+# approved for use only in its inline state as Test::Inline::Util.
 # It will be released to CPAN at some later time, once complete.
 # We ask that until that time you respect our development process and
 # do not use this code.
@@ -8,7 +8,7 @@ use strict;
 use File::Spec::Functions ':ALL';
 use vars qw{$VERSION};
 BEGIN {
-$VERSION = '2.100';
+$VERSION = '2.101';
 }
 sub shorten {
 my $class = ref $_[0] ? ref shift : shift;
@@ -12,7 +12,7 @@ Embedding tests allows tests to be placed near the code it's testing.
 
 This is a nice supplement to the traditional .t files.
 
-It's like XUnit, Perl-style.
+It's like XUnit, only better and Perl-style.
 
 =head2 How does it work?
 
@@ -28,7 +28,7 @@ following.
   ok( -f /proc/cpuinfo, 'Host has a standard /proc/cpuinfo file' );
   
   =end testing
-
+  
   # Completely test a single method
   
   =begin testing label
@@ -112,9 +112,9 @@ will be run after the numbered tests.
 =cut
 
 use strict;
-use UNIVERSAL 'isa';
 use File::Spec            ();
 use IO::Handle            ();
+use Params::Util          qw{_CLASS _INSTANCE _SCALAR _CODE};
 use Algorithm::Dependency ();
 use Test::Inline::Util    ();
 use Test::Inline::Section ();
@@ -131,7 +131,7 @@ use base 'Algorithm::Dependency::Source';
 
 use vars qw{$VERSION};
 BEGIN {
-	$VERSION = '2.100';
+	$VERSION = '2.101';
 }
 
 
@@ -206,7 +206,7 @@ Returns C<undef> if there is a problem with one of the options.
 
 # For now, the various Handlers are hard-coded
 sub new {
-	my $class  = ref $_[0] ? die '->new is a static method' : shift;
+	my $class  = _CLASS(shift) or die '->new is a static method';
 	my %params = @_;
 
 	# Create the object
@@ -238,7 +238,7 @@ sub new {
 
 	# Support the legacy file_content param
 	if ( $params{file_content} ) {
-		return undef unless ref $params{file_content} eq 'CODE';
+		_CODE($params{file_content}) or return undef;
 		$self->{ContentHandler} = Test::Inline::Content::Legacy->new( $params{file_content} ) or return undef;
 	}
 
@@ -416,7 +416,7 @@ sub _add_directory {
 # Actually add the source code
 sub _add_source {
 	my $self   = shift;
-	my $source = ref $_[0] eq 'SCALAR' ? shift : return undef;
+	my $source = _SCALAR(shift) or return undef;
 
 	# Extract the elements from the source code
 	my $Extract = $self->ExtractHandler->new( $source )
@@ -638,7 +638,7 @@ sub _file {
 
 sub _save {
 	my $self     = shift;
-	my $class    = shift                    or return undef;
+	my $class    = shift                or return undef;
 	my $filename = $self->_file($class) or return undef;
 	local $| = 1;
 
@@ -706,11 +706,11 @@ sub _source {
 		}
 		return undef;
 	}
-	if ( ref $_[0] eq 'SCALAR' ) {
+	if ( _SCALAR($_[0]) ) {
 		# Reference to SCALAR containing code
 		return shift;
 	}
-	if ( isa(ref $_[0], 'IO::Handle') ) {
+	if ( _INSTANCE($_[0], 'IO::Handle') ) {
 		my $fh   = shift;
 		my $old  = $fh->input_record_separator(undef);
 		my $code = $fh->getline;
@@ -740,6 +740,12 @@ sub _error {
 
 =pod
 
+=head1 BUGS
+
+The "Extended =begin" syntax used for non-trivial sections is not really
+considered part of the spec yet. While simple '=begin testing' sections are
+find and will pass POD testing, extended begin sections may cause POD errors.
+
 =head1 TO DO
 
 - Add support for C<example> sections
@@ -63,7 +63,7 @@ is( $basic->{check_count}, 2, '->new( check_count => 2 ) initialises correctly'
 # =begin testing SETUP 0
 $::__tc = Test::Builder->new->current_test;
 my $Foo = Foo::Bar->new();
-is( Test::Builder->new->current_test, $::__tc,
+is( Test::Builder->new->current_test - $::__tc, 0,
 	'0 tests were run in the section' );
 
 
@@ -73,7 +73,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is also a test
 }
-is( Test::Builder->new->current_test, $::__tc + 2,
+is( Test::Builder->new->current_test - $::__tc, 2,
 	'2 tests were run in the section' );
 
 
@@ -83,7 +83,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 Final test
 }
-is( Test::Builder->new->current_test, $::__tc + 4,
+is( Test::Builder->new->current_test - $::__tc, 4,
 	'4 tests were run in the section' );
 
 
@@ -93,7 +93,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is another test
 }
-is( Test::Builder->new->current_test, $::__tc + 3,
+is( Test::Builder->new->current_test - $::__tc, 3,
 	'3 tests were run in the section' );
 
 
@@ -103,7 +103,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is a test
 }
-is( Test::Builder->new->current_test, $::__tc + 1,
+is( Test::Builder->new->current_test - $::__tc, 1,
 	'1 test was run in the section' );
 END_TEST
 
@@ -140,7 +140,7 @@ $example  = File::Spec->catfile( 't.data', 'check_count' );
 # =begin testing SETUP 0
 $::__tc = Test::Builder->new->current_test;
 my $Foo = Foo::Bar->new();
-is( Test::Builder->new->current_test, $::__tc,
+is( Test::Builder->new->current_test - $::__tc, 0,
 	'0 tests were run in the section' );
 
 
@@ -164,7 +164,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is another test
 }
-is( Test::Builder->new->current_test, $::__tc + 3,
+is( Test::Builder->new->current_test - $::__tc, 3,
 	'3 tests were run in the section' );
 
 
@@ -174,7 +174,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is a test
 }
-is( Test::Builder->new->current_test, $::__tc + 1,
+is( Test::Builder->new->current_test - $::__tc, 1,
 	'1 test was run in the section' );
 END_TEST
 
@@ -204,7 +204,7 @@ END_TEST
 # =begin testing SETUP 0
 $::__tc = Test::Builder->new->current_test;
 my $Foo = Foo::Bar->new();
-is( Test::Builder->new->current_test, $::__tc,
+is( Test::Builder->new->current_test - $::__tc, 0,
 	'0 tests were run in the section' );
 
 
@@ -228,7 +228,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is another test
 }
-is( Test::Builder->new->current_test, $::__tc + 3,
+is( Test::Builder->new->current_test - $::__tc, 3,
 	'3 tests were run in the section' );
 
 
@@ -238,7 +238,7 @@ $::__tc = Test::Builder->new->current_test;
 {
 This is a test
 }
-is( Test::Builder->new->current_test, $::__tc + 1,
+is( Test::Builder->new->current_test - $::__tc, 1,
 	'1 test was run in the section' );
 END_TEST
 
@@ -73,7 +73,7 @@ eval q{
 };
 is($@, '', 'Example 1 compiles cleanly');
 }
-is( Test::Builder->new->current_test, $::__tc + 1,
+is( Test::Builder->new->current_test - $::__tc, 1,
 	'1 test was run in the section' );
 
 
@@ -104,37 +104,37 @@ END_TEMPLATE
 $rv = $Simple->process( $Inline, $Script );
 ok( (defined $rv and ! ref $rv and length $rv), '->process(good) returns a string' );
 is( $rv, <<'END_CODE', '->process inserts the code as expected' );
-tests => 10
-
-# =begin testing SETUP 0
-my $Foo = Foo::Bar->new();
-
-
-
-# =begin testing bar 2
-{
-This is also a test
-}
-
-
-
-# =begin testing that after bar 4
-{
-Final test
-}
-
-
-
-# =begin testing foo after bar that 3
-{
-This is another test
-}
-
-
-
-# =begin testing 1
-{
-This is a test
-}
+tests => 10
+
+# =begin testing SETUP 0
+my $Foo = Foo::Bar->new();
+
+
+
+# =begin testing bar 2
+{
+This is also a test
+}
+
+
+
+# =begin testing that after bar 4
+{
+Final test
+}
+
+
+
+# =begin testing foo after bar that 3
+{
+This is another test
+}
+
+
+
+# =begin testing 1
+{
+This is a test
+}
 
 END_CODE
@@ -1,4 +1,35 @@
 use Test::More;
 eval "use Test::Pod 1.00";
 plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+
+#####################################################################
+# WARNING: INSANE BLACK MAGIC
+#####################################################################
+
+# Hack Pod::Simple::BlackBox to ignore the Test::Inline "=begin has more than one word errors"
+my $begin = \&Pod::Simple::BlackBox::_ponder_begin;
+sub mybegin {
+	my $para = $_[1];
+	my $content = join ' ', splice @$para, 2;
+	$content =~ s/^\s+//s;
+	$content =~ s/\s+$//s;
+	my @words = split /\s+/, $content;
+	if ( $words[0] =~ /^test(?:ing)?\z/s ) {
+		foreach ( 2 .. $#$para ) {
+			$para->[$_] = '';
+		}
+		$para->[2] = $words[0];
+	}
+
+	# Continue as normal
+	return &$begin(@_);
+}
+
+local $^W = 0;
+*Pod::Simple::BlackBox::_ponder_begin = \&mybegin;
+
+#####################################################################
+# END BLACK MAGIC
+#####################################################################
+
 all_pod_files_ok();