Commit | Line | Data |
9ee33178 |
1 | package Data::Query::ExprBuilder; |
2 | |
3 | use strictures 1; |
b616bc41 |
4 | use Scalar::Util (); |
12e6eab8 |
5 | use Data::Query::ExprHelpers qw(perl_scalar_value perl_operator); |
b616bc41 |
6 | |
7 | use 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 | ), |
b616bc41 |
46 | ); |
9ee33178 |
47 | |
48 | sub new { |
49 | bless({ %{$_[1]} }, (ref($_[0])||$_[0])); |
50 | } |
51 | |
52 | 1; |