Explicitly use default names for builders and clearers
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index 46a9e39..8a0bae9 100644 (file)
@@ -1,13 +1,19 @@
 package SQL::Abstract; # see doc at end of file
 
+use SQL::Abstract::_TempExtlib;
+
 use Carp ();
 use List::Util ();
 use Scalar::Util ();
 use Module::Runtime qw(use_module);
+use Sub::Quote 'quote_sub';
 use Moo;
 use namespace::clean;
 
-our $VERSION  = '1.74';
+# DO NOT INCREMENT TO 2.0 WITHOUT COORDINATING WITH mst OR ribasushi
+      our $VERSION  = '1.99_01';
+# DO NOT INCREMENT TO 2.0 WITHOUT COORDINATING WITH mst OR ribasushi
+
 # This would confuse some packagers
 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
 
@@ -21,27 +27,27 @@ sub puke (@) {
   Carp::croak "[$func] Fatal: ", @_;
 }
 
-has converter => (is => 'lazy', clearer => 'clear_converter');
+has converter => (is => 'lazy', clearer => 1);
 
 has case => (
-  is => 'ro', coerce => sub { $_[0] eq 'lower' ? 'lower' : undef }
+  is => 'ro', coerce => quote_sub( q{ $_[0] eq 'lower' ? 'lower' : undef } ),
 );
 
 has logic => (
-  is => 'ro', coerce => sub { uc($_[0]) }, default => sub { 'OR' }
+  is => 'ro', coerce => quote_sub( q{ uc($_[0]) } ), default => 'OR',
 );
 
 has bindtype => (
-  is => 'ro', default => sub { 'normal' }
+  is => 'ro', default => 'normal'
 );
 
-has cmp => (is => 'ro', default => sub { '=' });
+has cmp => (is => 'ro', default => '=');
 
-has sqltrue => (is => 'ro', default => sub { '1=1' });
-has sqlfalse => (is => 'ro', default => sub { '0=1' });
+has sqltrue => (is => 'ro', default => '1=1' );
+has sqlfalse => (is => 'ro', default => '0=1' );
 
-has special_ops => (is => 'ro', default => sub { [] });
-has unary_ops => (is => 'ro', default => sub { [] });
+has special_ops => (is => 'ro', default => quote_sub( q{ [] } ));
+has unary_ops => (is => 'ro', default => quote_sub( q{ [] } ));
 
 # FIXME
 # need to guard against ()'s in column names too, but this will break tons of
@@ -49,44 +55,44 @@ has unary_ops => (is => 'ro', default => sub { [] });
 
 has injection_guard => (
   is => 'ro',
-  default => sub {
+  default => quote_sub( q{
     qr/
       \;
         |
       ^ \s* go \s
     /xmi;
-  }
+  })
 );
 
-has renderer => (is => 'lazy', clearer => 'clear_renderer');
+has renderer => (is => 'lazy', clearer => 1);
 
 has name_sep => (
-  is => 'rw', default => sub { '.' },
-  trigger => sub {
+  is => 'rw', default => '.',
+  trigger => quote_sub( q{
     $_[0]->clear_renderer;
     $_[0]->clear_converter;
-  },
+  }),
 );
 
 has quote_char => (
   is => 'rw',
-  trigger => sub {
+  trigger => quote_sub( q{
     $_[0]->clear_renderer;
     $_[0]->clear_converter;
-  },
+  }),
 );
 
 has collapse_aliases => (
   is => 'ro',
-  default => sub { 0 }
+  default => 0,
 );
 
 has always_quote => (
-  is => 'rw', default => sub { 1 },
-  trigger => sub {
+  is => 'rw', default => 1,
+  trigger => quote_sub( q{
     $_[0]->clear_renderer;
     $_[0]->clear_converter;
-  },
+  }),
 );
 
 has convert => (is => 'ro');
@@ -94,8 +100,8 @@ has convert => (is => 'ro');
 has array_datatypes => (is => 'ro');
 
 has converter_class => (
-  is => 'rw', lazy => 1, builder => '_build_converter_class',
-  trigger => sub { shift->clear_converter },
+  is => 'rw', lazy => 1, builder => 1,
+  trigger => quote_sub( q{ $_[0]->clear_converter } ),
 );
 
 sub _build_converter_class {
@@ -104,10 +110,10 @@ sub _build_converter_class {
 
 has renderer_class => (
   is => 'rw', lazy => 1, clearer => 1, builder => 1,
-  trigger => sub { shift->clear_renderer },
+  trigger => quote_sub( q{ $_[0]->clear_renderer } ),
 );
 
-after clear_renderer_class => sub { shift->clear_renderer };
+after clear_renderer_class => sub { $_[0]->clear_renderer };
 
 sub _build_renderer_class {
   my ($self) = @_;
@@ -276,16 +282,6 @@ sub _assert_pass_injection_guard {
 # Conversion, if applicable
 sub _convert ($) {
   #my ($self, $arg) = @_;
-
-# LDNOTE : modified the previous implementation below because
-# it was not consistent : the first "return" is always an array,
-# the second "return" is context-dependent. Anyway, _convert
-# seems always used with just a single argument, so make it a
-# scalar function.
-#     return @_ unless $self->{convert};
-#     my $conv = $self->_sqlcase($self->{convert});
-#     my @ret = map { $conv.'('.$_.')' } @_;
-#     return wantarray ? @ret : $ret[0];
   if ($_[0]->{convert}) {
     return $_[0]->_sqlcase($_[0]->{convert}) .'(' . $_[1] . ')';
   }
@@ -295,11 +291,6 @@ sub _convert ($) {
 # And bindtype
 sub _bindtype (@) {
   #my ($self, $col, @vals) = @_;
-
-  #LDNOTE : changed original implementation below because it did not make
-  # sense when bindtype eq 'columns' and @vals > 1.
-#  return $self->{bindtype} eq 'columns' ? [ $col, @vals ] : @vals;
-
   # called often - tighten code
   return $_[0]->{bindtype} eq 'columns'
     ? map {[$_[1], $_]} @_[2 .. $#_]
@@ -1217,15 +1208,19 @@ then you should use the and/or operators:-
     my %where  = (
         -and           => [
             -bool      => 'one',
-            -bool      => 'two',
-            -bool      => 'three',
-            -not_bool  => 'four',
+            -not_bool  => { two=> { -rlike => 'bar' } },
+            -not_bool  => { three => [ { '=', 2 }, { '>', 5 } ] },
         ],
     );
 
 Would give you:
 
-    WHERE one AND two AND three AND NOT four
+    WHERE
+      one
+        AND
+      (NOT two RLIKE ?)
+        AND
+      (NOT ( three = ? OR three > ? ))
 
 
 =head2 Nested conditions, -and/-or prefixes
@@ -1748,6 +1743,9 @@ can be as simple as the following:
 
     #!/usr/bin/perl
 
+    use warnings;
+    use strict;
+
     use CGI::FormBuilder;
     use SQL::Abstract;