private function doExecute($fetch = false, $fetchMode = null, $fetchClass = null)
    {
        if ($fetch) {
            $fetchMode = Database::normalizeFetchType($fetchMode);
        }

        // Parse SQL and Bind
        $sql = $this->query->getSQL();
        $bind = $this->query->getBind();

        // Connection and execute
        $statement = $this->connection->prepare($sql);

        foreach ($bind as $idx => $value) {
            $statement->bindValue(($idx+1), $value, Database::typeOfValue($value));
        }

        // Fetch
        if ($fetch) {
            if ($fetchMode === Database::FETCH_CLASS) {
                // Verify class
                new \ReflectionClass($fetchClass);

                $statement->setFetchMode($fetchMode, $fetchClass);
            } else {
                $statement->setFetchMode($fetchMode);
            }
        }

        // Execute
        $success = $statement->execute();
        if (! $success) {
            return false;
        }

        if ($fetch && $fetch === 'single') {
            return $statement->fetch();
        }
        if ($fetch) {
            return $statement->fetchAll();
        }

        return true;
    }