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);
	}
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);
	}
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 ) ; }
The `find` method allows you to retrieve data from the connected data source.

Examples:
```
Posts::find('all'); // returns all records
Posts::find('count'); // returns a count of all records

// The first ten records that have `'author'` set to `'Bob'`.
Posts::find('all', [
'conditions' => ['author' => 'Bob'],
'limit' => 10
]);

// First record where the id matches 23.
Posts::find('first', [
'conditions' => ['id' => 23]
]);
```

Shorthands:
```
// Shorthand for find first by primary key.
Posts::find(23);

// Also works with objects.
Posts::find(new MongoId(23));
```

@see lithium\data\Model::finder()
@param string|object|integer $type The name of the finder to use. By default the
following finders are available. Custom finders can be added via `Model::finder()`.
- `'all'`: Returns all records matching the conditions.
- `'first'`: Returns the first record matching the conditions.
- `'count'`: Returns an integer count of all records matching the conditions.
When using `Database` adapter, you can specify the field to count on
via `fields`, when multiple fields are given does a count on all fields (`'*'`).
- `'list'`: Returns a one dimensional array, where the key is the (primary)p
key and the value the title of the record (the record must have a `'title'`
field). A result may look like: `[1 => 'Foo', 2 => 'Bar']`.

Instead of the name of a finder, also supports shorthand usage with an object or
integer as the first parameter. When passed such a value it is equal to
`Model::find('first', ['conditions' => ['<key>' => <value>]])`.

Note: When an undefined finder is tried to be used, the method will not error out, but
fallback to the `'all'` finder.
@param array $options Options for the query.
Common options accepted are:
- `'conditions'` _array_: The conditions for the query
i.e. `'array('is_published' => true)`.
- `'fields'` _array|null_: The fields that should be retrieved. When set to
`null` or `'*'` and by default, uses all fields. To optimize query performance,
limit the fields to just the ones actually needed.
- `'order'` _array|string_: The order in which the data will be returned,
i.e. `'created ASC'` sorts by created date in ascending order. To sort by
multiple fields use the array syntax `array('title' => 'ASC', 'id' => 'ASC)`.
- `'limit'` _integer_: The maximum number of records to return.
- `'page'` _integer_: Allows to paginate data sets. Specifies the page of the set
together with the limit option specifying the number of records per page. The first
page starts at `1`. Equals limit * offset.
- `'with'` _array_: Relationship names to be included in the query.
Also supported are:
- `'offset'` _integer_
- `'having'` _array|string_
- `'group'` _array|string_
- `'joins'` _array_
@return mixed The result/s of the find. Actual result depends on the finder being used. Most
often this is an instance of `lithium\data\Collection` or `lithium\data\Entity`.
@filter Allows to execute logic before querying (i.e. for rewriting of $options)
or after i.e. for caching results.
The find method allows you to retrieve data from the connected data source .