function GetAll($where = null, $orderby = null, $limit = null, $offset = null) {
		$this->LoadSchema();
		if ($this->UseCache('getall')) {
			$params = func_get_args();
			$cacheid = md5(json_encode($params));

			if ($value = $this->GetCache('getall', $cacheid))
				return $value;
		}

		$this->ResetQuery(array(
			'method' => 'getall',
			'table' => $this->table,
			'where' => $where,
			'orderby' => $orderby,
			'limit' => $limit,
			'offset' => $offset,
		));

		$this->Trigger('access', $where);
		if (!$this->continue)
			return array();

		$this->Trigger('pull', $where);
		if (!$this->continue)
			return array();

		$this->Trigger('getall', $where, $orderby, $limit, $offset);
		if (!$this->continue)
			return array();

		$this->db->from($this->table);

		if ($where = $this->FilterFields($where, 'where'))
			$this->db->where($where);
		if ($orderby)
			$this->db->order_by($orderby);
		if ($limit || $offset)
			$this->db->limit($limit,$offset);

		$out = array();
		foreach ($this->db->get()->result_array() as $row) {
			$this->ApplyRow($row);
			if (!$this->continue)
				return array();
			$out[] = $row;
		}

		$this->Trigger('rows', $out);
		if (!$this->continue)
			return array();

		return isset($cacheid) ? $this->SetCache('getall', $cacheid, $out) : $out;
	}