version with the better diagnostics
Stevan Little [Tue, 15 Nov 2005 21:40:51 +0000 (21:40 +0000)]
ChangeLog
Makefile.PL
README
lib/Class/C3.pm
t/10_Inconsistent_hierarchy.t
t/32_next_method_edge_cases.t

index 03b0434..fc38de9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 Revision history for Perl extension Class::C3.
 
+0.06 - 
+    - added Sub::Name to dependencies (even though it is
+      just for the tests)
+    - removed OS X resource fork which slipped into the tar.gz
+    - improved error reporting for Inconsistent Hierarchies
+
 0.05 - Mon, Nov 14, 2005
     - added caching to next::method, courtesy of quicksilver
       and mst over at #dbi-class
index f62e12e..8df0ff9 100644 (file)
@@ -1,12 +1,11 @@
 use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
 WriteMakefile(
     'NAME'             => 'Class::C3',
     'VERSION_FROM'     => 'lib/Class/C3.pm', # finds $VERSION
     'PREREQ_PM'                => {
         'Test::More'      => 0.47,
         'Test::Exception' => 0.15,
-        'Scalar::Util'    => 1.10      
+        'Scalar::Util'    => 1.10,
+        'Sub::Name'       => 0
                }
 );
diff --git a/README b/README
index 4941635..bb4f26e 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Class::C3 version 0.05
+Class::C3 version 0.06
 ===========================
 
 INSTALLATION
index 1b4ea74..ae2635b 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 
 use Scalar::Util 'blessed';
 
-our $VERSION = '0.05';
+our $VERSION = '0.06';
 
 # this is our global stash of both 
 # MRO's and method dispatch tables
@@ -139,12 +139,14 @@ sub _remove_method_dispatch_table {
 #   http://www.python.org/2.3/mro.html
 sub _merge {                
     my (@seqs) = @_;
+    my $class_being_merged = $seqs[0]->[0];
     my @res; 
     while (1) {
         # remove all empty seqences
         my @nonemptyseqs = (map { (@{$_} ? $_ : ()) } @seqs);
         # return the list if we have no more no-empty sequences
         return @res if not @nonemptyseqs; 
+        my $reject;
         my $cand; # a canidate ..
         foreach my $seq (@nonemptyseqs) {
             $cand = $seq->[0]; # get the head of the list
@@ -159,9 +161,12 @@ sub _merge {
                 $nothead++ && last if exists $in_tail{$cand};      
             }
             last unless $nothead; # leave the loop with our canidate ...
+            $reject = $cand;
             $cand = undef;        # otherwise, reject it ...
         }
-        die "Inconsistent hierarchy" if not $cand;
+        die "Inconsistent hierarchy found while merging '$class_being_merged':\n\t" .
+            "current merge results [\n\t\t" . (join ",\n\t\t" => @res) . "\n\t]\n\t" .
+            "mergeing failed on '$reject'\n" if not $cand;
         push @res => $cand;
         # now loop through our non-empties and pop 
         # off the head if it matches our canidate
index b558146..85ba0c6 100644 (file)
@@ -51,4 +51,5 @@ eval {
     # and watch it explode :)
     Class::C3::calculateMRO('Z') 
 };
+#diag $@;
 like($@, qr/^Inconsistent hierarchy/, '... got the right error with an inconsistent hierarchy');
index 4f85e74..0e5e913 100644 (file)
@@ -9,6 +9,8 @@ BEGIN {
     use_ok('Class::C3');
 }
 
+use Sub::Name;
+
 {
 
     {
@@ -38,8 +40,6 @@ BEGIN {
         our @ISA = ('Foo');
     }
     
-    use Sub::Name;
-    
     my $m = sub { (shift)->next::method() };
     subname('Bar::bar', $m);
     {