X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FClauses.pm;h=fd98e731a33a9b8afdffa20b836c92bfb0dcb408;hb=d175037fcf14677c8969f3ab389d00eba99d306c;hp=bbe6eb90ca5c36203f05298892a90699115436df;hpb=b4546197606e6701074a60a7cb7548546f795999;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract/Clauses.pm b/lib/SQL/Abstract/Clauses.pm index bbe6eb9..fd98e73 100644 --- a/lib/SQL/Abstract/Clauses.pm +++ b/lib/SQL/Abstract/Clauses.pm @@ -164,7 +164,7 @@ sub _render_statement { next unless defined($sql) and length($sql); push @parts, \@part; } - my ($sql, @bind) = $self->_join_parts(' ', @parts); + my ($sql, @bind) = $self->join_clauses(' ', @parts); return ( (our $Render_Top_Level ? $sql : '('.$sql.')'), @bind @@ -260,7 +260,7 @@ sub _expand_values { sub _render_values { my ($self, $values) = @_; - my ($v_sql, @bind) = $self->_join_parts( + my ($v_sql, @bind) = $self->join_clauses( ', ', map [ $self->render_aqt($_) ], ref($values) eq 'ARRAY' ? @$values : $values @@ -274,23 +274,37 @@ sub _render_values { sub _ext_rw { my ($self, $name, $key, $value) = @_; - return $self->{$name}{$key} unless @_ > 2; + return $self->{$name}{$key} unless @_ > 3; $self->{$name}{$key} = $value; return $self; } -sub expander { shift->_ext_rw(expand => @_) } -sub op_expander { shift->_ext_rw(expand_op => @_) } -sub renderer { shift->_ext_rw(render => @_) } -sub op_renderer { shift->_ext_rw(expand_op => @_) } -sub clause_expander { shift->_ext_rw(expand_clause => @_) } -sub clause_renderer { shift->_ext_rw(render_clause => @_) } +BEGIN { + foreach my $type (qw( + expand op_expand render op_render clause_expand clause_render + )) { + my $key = join '_', reverse split '_', $type; + my $singular = "${type}er"; + eval qq{sub ${singular} { shift->_ext_rw($key => \@_) }; 1 } + or die "Method builder failed for ${type}er: $@"; + eval qq{sub ${singular}s { + my (\$self, \@args) = \@_; + while (my (\$this_key, \$this_value) = splice(\@args, 0, 2)) { + \$self->{${key}}{\$this_key} = \$this_value; + } + return \$self; + }; 1 } or die "Method builder failed for ${singular}s: $@"; + } +} sub clauses_of { my ($self, $of, @clauses) = @_; unless (@clauses) { return @{$self->{clauses_of}{$of}||[]}; } + if (ref($clauses[0]) eq 'CODE') { + @clauses = $self->${\($clauses[0])}(@{$self->{clauses_of}{$of}||[]}); + } $self->{clauses_of}{$of} = \@clauses; return $self; }