Fix trailing whitespace
[dbsrgits/Data-Query.git] / lib / Data / Query / ExprBuilder.pm
CommitLineData
9ee33178 1package Data::Query::ExprBuilder;
2
3use strictures 1;
b616bc41 4use Scalar::Util ();
12e6eab8 5use Data::Query::ExprHelpers qw(perl_scalar_value perl_operator);
b616bc41 6
7use overload (
c3633a0e 8 # unary operators
9 (map {
10 my $op = $_;
11 $op => sub {
12 Data::Query::ExprBuilder->new({
12e6eab8 13 expr => perl_operator($op => $_[0]->{expr})
c3633a0e 14 });
15 }
16 } qw(! neg)),
7e599929 17 # binary operators
b616bc41 18 (map {
7e599929 19 my ($overload, $as) = ref($_) ? @$_ : ($_, $_);
20 $overload => sub {
b616bc41 21 Data::Query::ExprBuilder->new({
12e6eab8 22 expr => perl_operator(
23 $as,
b616bc41 24 map {
25 (Scalar::Util::blessed($_)
26 && $_->isa('Data::Query::ExprBuilder'))
27 ? $_->{expr}
12e6eab8 28 : perl_scalar_value($_)
c3633a0e 29 # we're called with ($left, $right, 0) or ($right, $left, 1)
b616bc41 30 } $_[2] ? @_[1,0] : @_[0,1]
12e6eab8 31 )
b616bc41 32 });
33 }
7e599929 34 }
35 qw(+ - * / % ** << >> . < > == != lt le gt ge eq ne),
36
37 # since 'and' and 'or' aren't operators we borrow the bitwise ops
38 [ '&' => 'and' ], [ '|' => 'or' ],
39 ),
40 # unsupported
9e0200bc 41 (map {
42 my $op = $_;
43 $op => sub { die "Can't use operator $op on a ".ref($_[0]) }
7e599929 44 } qw(<=> cmp x ^ ~)
9e0200bc 45 ),
8e97944c 46 fallback => 1,
49299143 47);
9ee33178 48
49sub new {
50 bless({ %{$_[1]} }, (ref($_[0])||$_[0]));
51}
52
531;