    package flare.query
    {
        /**
         * Expression operator that computes the exclusive-or ("xor") of
         * sub-expression clauses.
         */
        public class Xor extends CompositeExpression
        {
            /**
             * Creates a new Xor operator.
             * @param clauses the sub-expression clauses
             */
            public function Xor(...clauses) {
                super(clauses);
            }

            /**
             * @inheritDoc
             */
            public override function clone():Expression
            {
                return cloneHelper(new Xor());
            }

            /**
             * @inheritDoc
             */
            public override function eval(o:Object=null):*
            {
                return predicate(o);
            }

            /**
             * @inheritDoc
             */
            public override function predicate(o:Object):Boolean
            {
                if (_children.length == 0) return false;

                var b:Boolean = _children[0].predicate(o);
                for (var i:int=1; i<_children.length; ++i) {
                    b = (b != Expression(_children[i]).predicate(o));
                }
                return b;
            }

            /**
             * @inheritDoc
             */
            public override function toString():String
            {
                return _children.length==0 ? "FALSE" : super.getString("XOR");
            }

        } // end of class Xor
    }