X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FData%2FQuery%2FExprBuilder.pm;h=ee3070210b35e9063ead5fbd2d7359d2d0a35f16;hb=d68bc999eebe149828979ea280173b6e4dd6453d;hp=a1767f1cc2e085a4bb2fcaf959a4d811ac95ddd4;hpb=9ee33178ce8c375d48775c279075c93a24dcd92a;p=dbsrgits%2FData-Query.git diff --git a/lib/Data/Query/ExprBuilder.pm b/lib/Data/Query/ExprBuilder.pm index a1767f1..ee30702 100644 --- a/lib/Data/Query/ExprBuilder.pm +++ b/lib/Data/Query/ExprBuilder.pm @@ -1,6 +1,60 @@ package Data::Query::ExprBuilder; use strictures 1; +use Data::Query::Constants qw(DQ_OPERATOR DQ_VALUE); +use Scalar::Util (); + +use overload ( + # unary operators + (map { + my $op = $_; + $op => sub { + Data::Query::ExprBuilder->new({ + expr => { + type => DQ_OPERATOR, + operator => { Perl => $op }, + args => [ $_[0]->{expr} ] + } + }); + } + } qw(! neg)), + # binary operators + (map { + my ($overload, $as) = ref($_) ? @$_ : ($_, $_); + $overload => sub { + Data::Query::ExprBuilder->new({ + expr => { + type => DQ_OPERATOR, + operator => { Perl => $as }, + args => [ + map { + (Scalar::Util::blessed($_) + && $_->isa('Data::Query::ExprBuilder')) + ? $_->{expr} + : { + type => DQ_VALUE, + subtype => { Perl => 'Scalar' }, + value => $_ + } + # we're called with ($left, $right, 0) or ($right, $left, 1) + } $_[2] ? @_[1,0] : @_[0,1] + ] + }, + }); + } + } + qw(+ - * / % ** << >> . < > == != lt le gt ge eq ne), + + # since 'and' and 'or' aren't operators we borrow the bitwise ops + [ '&' => 'and' ], [ '|' => 'or' ], + ), + # unsupported + (map { + my $op = $_; + $op => sub { die "Can't use operator $op on a ".ref($_[0]) } + } qw(<=> cmp x ^ ~) + ), +); sub new { bless({ %{$_[1]} }, (ref($_[0])||$_[0]));