Fix obscure failure of CDBICompat accessor install on 5.8
Peter Rabbitson [Wed, 20 Apr 2016 10:31:23 +0000 (12:31 +0200)]
CDBICompat has a bizarre override of the CAG logic, in a way that only works
reliably at compiletime due to Class::C3 "cache" slots

A test implicitly starts covering this failcase once Class::Data::Inheritable
is removed sever commits later

lib/DBIx/Class/CDBICompat/ColumnGroups.pm

index f4c8ac8..44a6010 100644 (file)
@@ -83,7 +83,23 @@ sub _register_column_group {
 
     no strict 'refs';
     my $existing_accessor = *{$class .'::'. $name}{CODE};
-    return $existing_accessor && !$our_accessors{$existing_accessor};
+
+    return(
+      defined $existing_accessor
+        and
+      ! $our_accessors{$existing_accessor}
+        and
+      # under 5.8 mro the CODE slot may simply be a "cached method"
+      ! (
+        DBIx::Class::_ENV_::OLD_MRO
+          and
+        grep {
+          $_ ne $class
+            and
+          ($_->can($name)||0) == $existing_accessor
+        } @{mro::get_linear_isa($class)}
+      )
+    )
   }
 
   sub _deploy_accessor {