X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FData%2FQuery%2FExprHelpers.pm;h=809948e0e3cbf4ea5ca0601791e8d2be0952f28c;hb=912a19a259013e70538da5f2657c5998270d52e9;hp=be56f2f6c1df90ab018a2bdc2e89b70e44625459;hpb=e3335558366cad6a9cc6a6da3a7fe2c40e26639a;p=dbsrgits%2FData-Query.git diff --git a/lib/Data/Query/ExprHelpers.pm b/lib/Data/Query/ExprHelpers.pm index be56f2f..809948e 100644 --- a/lib/Data/Query/ExprHelpers.pm +++ b/lib/Data/Query/ExprHelpers.pm @@ -5,7 +5,11 @@ use Data::Query::Constants; use base qw(Exporter); -our @EXPORT = qw(perl_scalar_value perl_operator Literal Identifier compose); +our @EXPORT = qw( + perl_scalar_value perl_operator Literal Identifier compose intersperse +); + +sub intersperse { my $i = shift; my @i = map +($_, $i), @_; pop @i; @i } sub perl_scalar_value { +{ @@ -71,13 +75,21 @@ foreach my $name (values %Data::Query::Constants::CONST) { $dq->{type} and $dq->{type} eq $name }; push @EXPORT, $sub; - if ($map{$name}) { - my @map = @{$map{$name}}; + if (my @map = @{$map{$name}||[]}) { *$name = sub { my $dq = { type => $name }; - foreach (0..$#_) { + foreach (0..$#map) { $dq->{$map[$_]} = $_[$_] if defined $_[$_]; } + + if (my $optional = $_[$#map+1]) { + unless(ref $optional eq 'HASH') { + require Carp; + Carp::croak("Not a hashreference"); + } + @{$dq}{keys %$optional} = values %$optional; + } + return $dq; }; push @EXPORT, $name;