public static function find($type, array $options = []) {
		$self = static::_object();

		if (is_object($type) || !isset($self->_finders[$type])) {
			$options['conditions'] = static::key($type);
			$type = 'first';
		}

		$options += (array) $self->_query;
		$meta = ['meta' => $self->_meta, 'name' => get_called_class()];
		$params = compact('type', 'options');

		$implementation = function($params) use ($meta) {
			$options = $params['options'] + ['type' => 'read', 'model' => $meta['name']];
			$query = static::_instance('query', $options);

			return static::connection()->read($query, $options);
		};
		if (isset($self->_finders[$type])) {
			$finder = $self->_finders[$type];

			$reflect = new \ReflectionFunction($finder);
			if ($reflect->getNumberOfParameters() > 2) {
				$message  = 'Old style finder function in file ' . $reflect->getFileName() . ' ';
				$message .= 'on line ' . $reflect->getStartLine() . '. ';
				$message .= 'The signature for finder functions has changed. It is now ';
				$message .= '`($params, $next)` instead of the old `($self, $params, $chain)`. ';
				$message .= 'Instead of `$self` use `$this` or `static`.';
				trigger_error($message, E_USER_DEPRECATED);

				return Filters::bcRun(
					get_called_class(), __FUNCTION__, $params, $implementation, [$finder]
				);
			}

			$implementation = function($params) use ($finder, $implementation) {
				return $finder($params, $implementation);
			};
		}
		return Filters::run(get_called_class(), __FUNCTION__, $params, $implementation);
	}