introduce keyword concept to avoid private methods
[scpubgit/Q-Branch.git] / lib / SQL / Abstract / ExtraClauses.pm
index c46a632..618356e 100644 (file)
@@ -28,8 +28,18 @@ sub register_defaults {
   $self->expander(as => '_expand_op_as');
   $self->renderer(as => '_render_as');
 
-  splice(@{$self->{clauses_of}{update}}, 2, 0, 'from');
-  splice(@{$self->{clauses_of}{delete}}, 1, 0, 'using');
+  $self->clauses_of(update => sub {
+    my ($self, @clauses) = @_;
+    splice(@clauses, 2, 0, 'from');
+    @clauses;
+  });
+
+  $self->clauses_of(delete => sub {
+    my ($self, @clauses) = @_;
+    splice(@clauses, 1, 0, 'using');
+    @clauses;
+  });
+
   $self->clause_expanders(
     'update.from' => '_expand_select_clause_from',
     'delete.using' => sub {
@@ -42,6 +52,10 @@ sub register_defaults {
       +(from => $_[0]->expand_expr({ -select => $_[1] }));
     },
   );
+
+  $self->renderer(keyword => sub {
+    $_[0]->_sqlcase(join ' ', split '_', $_[1]);
+  });
   return $self;
 }
 
@@ -107,23 +121,18 @@ sub _render_join {
 
   my @parts = (
     [ $self->render_aqt($args->{from}) ],
-    [ $self->_sqlcase(
-        ($args->{type}
-          ? join(' ', split '_', $args->{type}).' '
-          : ''
-        )
-        .'join'
-      )
-    ],
+    [ $self->render_aqt(
+        { -keyword => join '_', ($args->{type}||()), 'join' }
+    ) ],
     [ $self->render_aqt(
         map +($_->{-ident} || $_->{-as} ? $_ : { -row => [ $_ ] }), $args->{to}
     ) ],
     ($args->{on} ? (
-      [ $self->_sqlcase('on') ],
+      [ $self->render_aqt({ -keyword => 'on' }) ],
       [ $self->render_aqt($args->{on}) ],
     ) : ()),
     ($args->{using} ? (
-      [ $self->_sqlcase('using') ],
+      [ $self->render_aqt({ -keyword => 'using' }) ],
       [ $self->render_aqt($args->{using}) ],
     ) : ()),
   );
@@ -143,7 +152,7 @@ sub _render_as {
   return $self->_join_parts(
     ' ',
     [ $self->render_aqt($thing) ],
-    [ $self->_sqlcase('as') ],
+    [ $self->render_aqt({ -keyword => 'as' }) ],
     (@cols
       ? [ $self->_join_parts('',
             [ $self->render_aqt($as) ],