unary operators
Matt S Trout [Sun, 6 Jun 2010 01:38:13 +0000 (02:38 +0100)]
lib/Data/Query/ExprBuilder.pm
t/expr.t

index 9e12dd6..3238a28 100644 (file)
@@ -5,6 +5,19 @@ 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($_) ? @$_ : ($_, $_);
@@ -23,6 +36,7 @@ use overload (
                    subtype => { perl => 'Scalar' },
                    value => $_
                  }
+              # we're called with ($left, $right, 0) or ($right, $left, 1)
             } $_[2] ? @_[1,0] : @_[0,1]
           ]
         },
index 590cc80..fed19d7 100644 (file)
--- a/t/expr.t
+++ b/t/expr.t
@@ -108,3 +108,11 @@ expr_is { $_->foo | $_->bar }
     ],
   },
   'Masquerade for | as or ok';
+
+expr_is { !$_->foo }
+  {
+    type => DQ_OPERATOR,
+    operator => { perl => '!' },
+    args => [ expr { $_->foo } ],
+  },
+  '! ok';