static Task::List parse(const QVariant &data)
    {
        const QVariantMap results = data.toMap();
        Task::List tasks;
        tasks.reserve(results.size());

        for (auto iter = results.cbegin(), end = results.cend(); iter != end; ++iter) {
            const QVariantMap d = iter.value().toMap();
            Task task;
            task.d_ptr->phid = iter.key().toLatin1();
            task.d_ptr->id = d[QStringLiteral("id")].toUInt();
            task.d_ptr->authorPHID = d[QStringLiteral("authorPHID")].toByteArray();
            task.d_ptr->ownerPHID = d[QStringLiteral("ownerPHID")].toByteArray();
            const QVariantList ccPHIDs = d[QStringLiteral("ccPHIDs")].toList();
            task.d_ptr->ccPHIDs.reserve(ccPHIDs.size());
            Q_FOREACH (const QVariant &ccPHID, ccPHIDs) {
                task.d_ptr->ccPHIDs.push_back(ccPHID.toByteArray());
            }
            task.d_ptr->status = d[QStringLiteral("status")].toString();
            task.d_ptr->statusName = d[QStringLiteral("statusName")].toString();
            task.d_ptr->isClosed = d[QStringLiteral("isClosed")].toBool();
            task.d_ptr->priority = d[QStringLiteral("priority")].toString();
            task.d_ptr->priorityColor = d[QStringLiteral("priorityColor")].toString();
            task.d_ptr->title = d[QStringLiteral("title")].toString();
            task.d_ptr->description = d[QStringLiteral("description")].toString();
            const QVariantList projectPHIDs = d[QStringLiteral("projectPHIDs")].toList();
            task.d_ptr->projectPHIDs.reserve(projectPHIDs.size());
            Q_FOREACH (const QVariant &projectPHID, projectPHIDs) {
                task.d_ptr->projectPHIDs.push_back(projectPHID.toByteArray());
            }