public function find(Query $query, $type, array $options = []) {
        $options = $options + [
            'before' => true,
            'after' => true,
            'collection' => $this->getConfig('collection')
        ];

        $finder = $this->getFinder($type);
        $state = null;

        if ($options['before']) {
            $event = $this->emit('db.preFind', [$query, $type]);
            $state = $event->getState();

            if (!$state) {
                return $finder->noResults($options);
            }
        }

        // Use the event response as the results
        if (is_array($state)) {
            $results = $state;

        // Query the driver for results
        } else {
            $finder->before($query, $options);

            // Update the connection context
            $results = $this->getDriver()
                ->setContext('read')
                ->executeQuery($query)
                ->find();
        }

        if (!$results) {
            return $finder->noResults($options);
        }

        if ($options['after']) {
            $this->emit('db.postFind', [&$results, $type]);
        }

        return $finder->after($results, $options);
    }