public function where(
        $col,
        $operator = ClauseInterface::NO_OPERATOR,
        $value    = ClauseInterface::NO_VALUE,
        /*# bool */ $logicAnd = true,
        /*# bool */ $whereNot = false,
        /*# bool */ $rawMode  = false,
        /*# string */ $clause = 'where'
    ) {
        // $col is an array
        if (is_array($col)) {
            foreach ($col as $fld => $val) {
                $this->where(
                    $fld, $val, ClauseInterface::NO_VALUE, $logicAnd,
                    $whereNot, $rawMode);
            }

        // $col is string or object
        } else {
            // grouped where
            if (is_object($col) && $col instanceof ExpressionInterface) {
                $operator = ClauseInterface::NO_OPERATOR;
                $value    = ClauseInterface::NO_VALUE;

            // 1 param provided, raw where provided
            } elseif (ClauseInterface::NO_OPERATOR === $operator) {
                $rawMode  = true;
                $value    = ClauseInterface::NO_VALUE;

            //  2 params provided
            } elseif (ClauseInterface::NO_VALUE === $value) {
                if (is_array($operator)) {
                    $value    = $operator[1];
                    $operator = $operator[0];
                } else {
                    $value    = $operator;
                    $operator = '=';
                }

            // short version provided
            } elseif (WhereInterface::SHORT_FORM === $value) {
                $value = ClauseInterface::NO_VALUE;
            }

            $this->clause_{$clause}[] = [
                $rawMode, $whereNot, $logicAnd, $col, $operator, $value
            ];
        }

        return $this;
    }
public function where(
        $col,
        $operator = ClauseInterface::NO_OPERATOR,
        $value    = ClauseInterface::NO_VALUE,
        /*# bool */ $logicAnd = true,
        /*# bool */ $whereNot = false,
        /*# bool */ $rawMode  = false,
        /*# string */ $clause = 'where'
    ) {
        // $col is an array
        if (is_array($col)) {
            foreach ($col as $fld => $val) {
                $this->where(
                    $fld, $val, ClauseInterface::NO_VALUE, $logicAnd,
                    $whereNot, $rawMode);
            }

        // $col is string or object
        } else {
            // grouped where
            if (is_object($col) && $col instanceof ExpressionInterface) {
                $operator = ClauseInterface::NO_OPERATOR;
                $value    = ClauseInterface::NO_VALUE;

            // 1 param provided, raw where provided
            } elseif (ClauseInterface::NO_OPERATOR === $operator) {
                $rawMode  = true;
                $value    = ClauseInterface::NO_VALUE;

            //  2 params provided
            } elseif (ClauseInterface::NO_VALUE === $value) {
                if (is_array($operator)) {
                    $value    = $operator[1];
                    $operator = $operator[0];
                } else {
                    $value    = $operator;
                    $operator = '=';
                }

            // short version provided
            } elseif (WhereInterface::SHORT_FORM === $value) {
                $value = ClauseInterface::NO_VALUE;
            }

            $this->clause_{$clause}[] = [
                $rawMode, $whereNot, $logicAnd, $col, $operator, $value
            ];
        }

        return $this;
    }
{@inheritDoc}