/**
         * 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);
                }
        }