Well how about them apples?! Add temporary overload-madness escape hatch
Peter Rabbitson [Fri, 19 Sep 2014 15:54:52 +0000 (17:54 +0200)]
lib/SQL/Abstract.pm
t/23_is_X_value.t
xt/91podcoverage.t

index c88d0c2..08f6011 100644 (file)
@@ -16,6 +16,11 @@ BEGIN {
   else {
     require mro;
   }
+
+  *SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION = $ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION}
+    ? sub () { 0 }
+    : sub () { 1 }
+  ;
 }
 
 #======================================================================
@@ -108,6 +113,8 @@ sub is_plain_value ($) {
           or
         # has nummification or boolification, AND fallback is *not* disabled
         (
+          SQL::Abstract::_ENV_::DETECT_AUTOGENERATED_STRINGIFICATION
+            and
           (
             grep { *{"${_}::(0+"}{CODE} } @{$_[2]}
               or
@@ -2153,6 +2160,48 @@ module:
 On failure returns C<undef>, on sucess returns a B<scalar> reference
 to the original supplied argument.
 
+=over
+
+=item * Note
+
+The stringification overloading detection is rather advanced: it takes
+into consideration not only the presence of a C<""> overload, but if that
+fails also checks for enabled
+L<autogenerated versions of C<"">|overload/Magic Autogeneration>, based
+on either C<0+> or C<bool>.
+
+Unfortunately testing in the field indicates that this
+detection B<< may tickle a latent bug in perl versions before 5.018 >>,
+but only when very large numbers of stringifying objects are involved.
+At the time of writing ( Sep 2014 ) there is no clear explanation of
+the direct cause, nor is there a manageably small test case that reliably
+reproduces the problem.
+
+If you encounter any of the following exceptions in B<random places within
+your application stack> - this module may be to blame:
+
+  Operation "ne": no method found,
+    left argument in overloaded package <something>,
+    right argument in overloaded package <something>
+
+or perhaps even
+
+  Stub found while resolving method "???" overloading """" in package <something>
+
+If you fall victim to the above - please attempt to reduce the problem
+to something that could be sent to the L<SQL::Abstract developers
+|DBIx::Class/GETTING_HELP/SUPPORT>
+(either publicly or privately). As a workaround in the meantime you can
+set C<$ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION}> to a true
+value, which will most likely eliminate your problem (at the expense of
+not being able to properly detect exotic forms of stringification).
+
+This notice and environment variable will be removed in a future version,
+as soon as the underlying problem is found and a reliable workaround is
+devised.
+
+=back
+
 =head2 is_literal_value
 
 Determines if the supplied argument is a literal value as understood by this
index 98bf9f2..b06501e 100644 (file)
@@ -6,6 +6,8 @@ use Test::Exception;
 use Scalar::Util 'refaddr';
 use Storable 'nfreeze';
 
+BEGIN { $ENV{SQLA_ISVALUE_IGNORE_AUTOGENERATED_STRINGIFICATION} = 0 }
+
 use SQL::Abstract qw(is_plain_value is_literal_value);
 
 # fallback setting is inheriting starting p5 50853fa9 (run up to 5.17.0)
index 427f0cb..3c02c82 100644 (file)
@@ -23,12 +23,11 @@ my @modules = sort { $a cmp $b } ( Test::Pod::Coverage::all_modules() );
 #   ignore => array ref containing list of methods which
 #             do not need to be documented.
 my $exceptions = {
-    'SQL::Abstract' => {
-        ignore => [
-            qw/belch
-              puke/
-        ]
-    },
+    'SQL::Abstract' => { ignore => [qw(
+      belch
+      puke
+      DETECT_AUTOGENERATED_STRINGIFICATION
+    )]},
     'SQL::Abstract::Tree' => { ignore => [qw(BUILDARGS)] },
     'SQL::Abstract::Test' => { skip => 1 },
     'DBIx::Class::Storage::Debug::PrettyPrint' => { skip => 1 },