public function findAndUpdate(array $query, array $newObj, array $options = [])
    {
        if ($this->eventManager->hasListeners(Events::preFindAndUpdate)) {
            $updateEventArgs = new UpdateEventArgs($this, $query, $newObj, $options);
            $this->eventManager->dispatchEvent(Events::preFindAndUpdate, $updateEventArgs);
            $query = $updateEventArgs->getQuery();
            $newObj = $updateEventArgs->getNewObj();
            $options = $updateEventArgs->getOptions();
        }

        $result = $this->doFindAndUpdate($query, $newObj, $options);

        if ($this->eventManager->hasListeners(Events::postFindAndUpdate)) {
            $eventArgs = new MutableEventArgs($this, $result);
            $this->eventManager->dispatchEvent(Events::postFindAndUpdate, $eventArgs);
            $result = $eventArgs->getData();
        }

        return $result;
    }