public function process(
        callable $callback = null,
        callable $successCallback = null,
        callable $failureCallback = null
    ) {
        if ($this->processed() === true) {
            // Do not process twice, ever.
            return null;
        }

        $email = $this->emailFactory()->create('email');

        $email->setData($this->data());

        try {
            $res = $email->send();
            if ($res === true) {
                $this->setProcessed(true);
                $this->setProcessedDate('now');
                $this->update(['processed', 'processed_date']);

                if ($successCallback !== null) {
                    $successCallback($this);
                }
            } else {
                if ($failureCallback !== null) {
                    $failureCallback($this);
                }
            }

            if ($callback !== null) {
                $callback($this);
            }

            return $res;
        } catch (Exception $e) {
            // Todo log error
            if ($failureCallback !== null) {
                $failureCallback($this);
            }

            return false;
        }
    }