Boolification-derived-stringification is a thing... just shoot me now
Peter Rabbitson [Fri, 19 Sep 2014 14:35:14 +0000 (16:35 +0200)]
lib/SQL/Abstract.pm
t/23_is_X_value.t

index 56bd631..c88d0c2 100644 (file)
@@ -98,8 +98,6 @@ sub is_plain_value ($) {
       # intersted in are much more limited than the fullblown thing, and
       # this is a very hot piece of code
       (
-        # FIXME - DBI needs fixing to stringify regardless of DBD
-        #
         # simply using ->can('(""') can leave behind stub methods that
         # break actually using the overload later (see L<perldiag/Stub
         # found while resolving method "%s" overloading "%s" in package
@@ -108,9 +106,13 @@ sub is_plain_value ($) {
         # either has stringification which DBI SHOULD prefer out of the box
         grep { *{ (qq[${_}::(""]) }{CODE} } @{ $_[2] = mro::get_linear_isa( $_[1] ) }
           or
-        # has nummification and fallback is *not* disabled
+        # has nummification or boolification, AND fallback is *not* disabled
         (
-          grep { *{"${_}::(0+"}{CODE} } @{ mro::get_linear_isa( $_[1] ) }
+          (
+            grep { *{"${_}::(0+"}{CODE} } @{$_[2]}
+              or
+            grep { *{"${_}::(bool"}{CODE} } @{$_[2]}
+          )
             and
           (
             # no fallback specified at all
index 8f37f0b..98bf9f2 100644 (file)
@@ -14,6 +14,22 @@ use constant STRINGIFIER_CAN_RETURN_IVS => ( ($] < 5.008) ? 0 : 1 );
 
 {
   package # hideee
+    SQLATest::SillyBool;
+
+  use overload
+    # *DELIBERATELY* unspecified
+    #fallback => 1,
+    bool => sub { ${$_[0]} },
+  ;
+
+  package # hideee
+    SQLATest::SillyBool::Subclass;
+
+  our @ISA = 'SQLATest::SillyBool';
+}
+
+{
+  package # hideee
     SQLATest::SillyInt;
 
   use overload
@@ -103,6 +119,8 @@ use constant STRINGIFIER_CAN_RETURN_IVS => ( ($] < 5.008) ? 0 : 1 );
 }
 
 for my $case (
+  { class => 'SQLATest::SillyBool',           can_math => 0, should_str => 1 },
+  { class => 'SQLATest::SillyBool::Subclass', can_math => 0, should_str => 1 },
   { class => 'SQLATest::SillyInt',            can_math => 0, should_str => 1 },
   { class => 'SQLATest::SillyInt::Subclass',  can_math => 0, should_str => 1 },
   { class => 'SQLATest::SillierInt',          can_math => 0, should_str => 0 },