/// <summary>
        /// Negates the result of key-filter operations.
        /// </summary>
        /// <param name="setup">
        /// An <see cref="Action{T}"/> that accepts a <see cref="RiakFluentKeyFilter"/>,
        /// which the <see cref="Not"/> function will logically negate it's output.
        /// </param>
        /// <returns>A reference to this updated instance, for fluent chaining.</returns>
        /// <remarks>
        /// Configure the phase with a lambda similar to:
        /// <code>.Not(kf => kf.EndsWith("foo"))</code>
        /// The above filter will return all input keys that don't end in "foo".
        /// </remarks>
        public RiakFluentKeyFilter Not(Action <RiakFluentKeyFilter> setup)
        {
            var filters = new List <IRiakKeyFilterToken>();
            var fluent  = new RiakFluentKeyFilter(filters);

            setup(fluent);
            filters.Add(new Not(filters));

            return(this);
        }
        /// <summary>
        /// Joins two key-filter operations with a logical AND operation.
        /// </summary>
        /// <param name="left">The left <see cref="RiakFluentKeyFilter"/> operand to AND together.</param>
        /// <param name="right">The right <see cref="RiakFluentKeyFilter"/> operand to AND together.</param>
        /// <returns>A reference to this updated instance, for fluent chaining.</returns>
        public RiakFluentKeyFilter And(Action <RiakFluentKeyFilter> left, Action <RiakFluentKeyFilter> right)
        {
            var leftFilters = new List <IRiakKeyFilterToken>();
            var leftFluent  = new RiakFluentKeyFilter(leftFilters);

            left(leftFluent);

            var rightFilters = new List <IRiakKeyFilterToken>();
            var rightFluent  = new RiakFluentKeyFilter(rightFilters);

            right(rightFluent);

            filters.Add(new And(leftFilters, rightFilters));

            return(this);
        }