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 | } |
b01a3688 |
35 | qw(+ - * / % ** << >> . < > lt le gt ge ), |
7e599929 |
36 | |
37 | # since 'and' and 'or' aren't operators we borrow the bitwise ops |
38 | [ '&' => 'and' ], [ '|' => 'or' ], |
39 | ), |
b01a3688 |
40 | |
41 | # equality operators (need undef maping) |
42 | (map { |
43 | my ($overload, $as) = ref($_) ? @$_ : ($_, $_); |
44 | $overload => sub { |
45 | Data::Query::ExprBuilder->new({ |
46 | expr => grep(!defined, @_[0,1]) |
47 | ? (map { $overload =~ /==|eq/ ? perl_operator(not => $_) : $_ } |
48 | perl_operator(defined => map { defined($_) ? $_->{expr} : () } @_[0,1])) |
49 | : perl_operator( |
50 | $as, |
51 | map { |
52 | (Scalar::Util::blessed($_) |
53 | && $_->isa('Data::Query::ExprBuilder')) |
54 | ? $_->{expr} |
55 | : perl_scalar_value($_) |
56 | # we're called with ($left, $right, 0) or ($right, $left, 1) |
57 | } $_[2] ? @_[1,0] : @_[0,1] |
58 | ) |
59 | }); |
60 | } |
61 | } |
62 | qw(== != eq ne) |
63 | |
64 | ), |
7e599929 |
65 | # unsupported |
9e0200bc |
66 | (map { |
67 | my $op = $_; |
68 | $op => sub { die "Can't use operator $op on a ".ref($_[0]) } |
7e599929 |
69 | } qw(<=> cmp x ^ ~) |
9e0200bc |
70 | ), |
8e97944c |
71 | fallback => 1, |
b616bc41 |
72 | ); |
9ee33178 |
73 | |
74 | sub new { |
75 | bless({ %{$_[1]} }, (ref($_[0])||$_[0])); |
76 | } |
77 | |
78 | 1; |