[php]
	/**
	 * Holds the parent mapping for join in fetchAll
	 *
	 * <code>
	 * array(
	 * 	'remote_table' => array(
	 * 		'remote' => 'id'
	 * 		'local' => 'remote_id',
	 * 		'fields' => array('foo', 'bar', 'prefix' => 'remote_'),
	 * 	),
	 * );
	 * </code>
	 *
	 * @var array
	 */

	protected $_parentMap = array();

	/**
	 * Honors the parent mapping from self::_parentMap
	 *
	 * @param string|array $where
	 * @param string|array $order
	 * @param integer $count
	 * @param integer $offset
	 * @return Zend_Db_Table_Rowset
	 */

	public function fetchAll($where = null, $order = null, $count = null, $offset = null) {
		if (!is_array($this->_cols)) {
			return parent::fetchAll($where, $order, $count, $offset);
		} else {
			$db = $this->getAdapter();
			$select = $db->select();
			$select ->from($this->_name, $this->_cols, $this->_schema)
					->order($order)
					->limit($offset, $count);

			if (!is_null($where)) {
				$select->where($where);
			}

			if (!empty($this->_parentMap)) {
				foreach($this->_parentMap as $parentTable => $specs) {
					$fields = array();
					if (isset($specs['fields']['prefix'])) {
						$prefix = $specs['fields']['prefix'];
						unset($specs['fields']['prefix']);
						foreach($specs['fields'] as $key => $field) {
							if (is_int($key)) {
								$key = $prefix.$field;
							}
							$fields[$key] = $field;
						}
					} else {
						$fields = $specs['fields'];
					}
					$select->join(
						$parentTable,
						sprintf('%s.%s = %s.%s',
							$db->quoteIdentifier($this->_name),
							$db->quoteIdentifier($specs['local']),
							$db->quoteIdentifier($parentTable),
							$db->quoteIdentifier($specs['remote'])
						),
						$fields
					);
				}
			}

			$stmt = $db->query($select);
			return $this->_makeRowset($stmt);
		}
	}