use Scalar::Util ();
use overload (
+ # unary operators
(map {
my $op = $_;
$op => sub {
Data::Query::ExprBuilder->new({
expr => {
type => DQ_OPERATOR,
- operator => { perl => $op },
+ 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($_)
? $_->{expr}
: {
type => DQ_VALUE,
- subtype => { perl => 'Scalar' },
+ subtype => { Perl => 'Scalar' },
value => $_
}
+ # we're called with ($left, $right, 0) or ($right, $left, 1)
} $_[2] ? @_[1,0] : @_[0,1]
]
},
});
}
- } qw(==))
+ }
+ 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 {