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];
},
);
+has collapse_aliases => (
+ is => 'ro',
+ default => sub { 0 }
+);
+
has always_quote => (
is => 'rw', default => sub { 1 },
trigger => sub {
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);
sub _build_converter {
my ($self) = @_;
- use_module($self->converter_class)->new($self->_converter_args);
+ $self->converter_class->new($self->_converter_args);
}
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 {
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);
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