Merge branch 'master' into dq
[dbsrgits/SQL-Abstract.git] / lib / SQL / Abstract.pm
index a8e4a57..d4867ab 100644 (file)
@@ -5,10 +5,11 @@ use List::Util ();
 use Scalar::Util ();
 use Module::Runtime qw(use_module);
 use Moo;
+use namespace::clean;
 
-our $VERSION  = '1.72';
-
-$VERSION = eval $VERSION;
+our $VERSION  = '1.74';
+# This would confuse some packagers
+$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
 
 sub belch (@) {
   my($func) = (caller(1))[3];
@@ -75,6 +76,11 @@ has quote_char => (
   },
 );
 
+has collapse_aliases => (
+  is => 'ro',
+  default => sub { 0 }
+);
+
 has always_quote => (
   is => 'rw', default => sub { 1 },
   trigger => sub {
@@ -88,13 +94,36 @@ has convert => (is => 'ro');
 has array_datatypes => (is => 'ro');
 
 has converter_class => (
-  is => 'ro', default => sub { 'SQL::Abstract::Converter' }
+  is => 'rw', lazy => 1, builder => '_build_converter_class',
+  trigger => sub { shift->clear_converter },
 );
 
+sub _build_converter_class {
+  use_module('SQL::Abstract::Converter')
+}
+
 has renderer_class => (
-  is => 'ro', default => sub { 'Data::Query::Renderer::SQL::Naive' }
+  is => 'rw', lazy => 1, clearer => 1, builder => 1,
+  trigger => sub { shift->clear_renderer },
 );
 
+after clear_renderer_class => sub { shift->clear_renderer };
+
+sub _build_renderer_class {
+  my ($self) = @_;
+  my ($class, @roles) = (
+    $self->_build_base_renderer_class, $self->_build_renderer_roles
+  );
+  return $class unless @roles;
+  return use_module('Moo::Role')->create_class_with_roles($class, @roles);
+}
+
+sub _build_base_renderer_class {
+  use_module('Data::Query::Renderer::SQL::Naive')
+}
+
+sub _build_renderer_roles { () }
+
 sub _converter_args {
   my ($self) = @_;
   Scalar::Util::weaken($self);
@@ -123,7 +152,7 @@ sub _converter_args {
 
 sub _build_converter {
   my ($self) = @_;
-  use_module($self->converter_class)->new($self->_converter_args);
+  $self->converter_class->new($self->_converter_args);
 }
 
 sub _renderer_args {
@@ -135,13 +164,14 @@ sub _renderer_args {
   +{
     quote_chars => $chars, always_quote => $self->always_quote,
     identifier_sep => $self->name_sep,
+    collapse_aliases => $self->collapse_aliases,
     ($self->case ? (lc_keywords => 1) : ()), # always 'lower' if it exists
   };
 }
 
 sub _build_renderer {
   my ($self) = @_;
-  use_module($self->renderer_class)->new($self->_renderer_args);
+  $self->renderer_class->new($self->_renderer_args);
 }
 
 sub _render_dq {
@@ -402,7 +432,7 @@ SQL::Abstract - Generate SQL from Perl data structures
 
     my $sql = SQL::Abstract->new;
 
-    my($stmt, @bind) = $sql->select($table, \@fields, \%where, \@order);
+    my($stmt, @bind) = $sql->select($source, \@fields, \%where, \@order);
 
     my($stmt, @bind) = $sql->insert($table, \%fieldvals || \@values);
 
@@ -830,8 +860,8 @@ the source.
 The argument can be either an arrayref (interpreted as a list
 of field names, will be joined by commas and quoted), or a
 plain scalar (literal SQL, not quoted).
-Please observe that this API is not as flexible as for
-the first argument C<$table>, for backwards compatibility reasons.
+Please observe that this API is not as flexible as that of
+the first argument C<$source>, for backwards compatibility reasons.
 
 =item $where