public function slice($idx, $len = null)
    {
        $c = $this->count();
        if ($idx < $c) {
            $ids = array();
        } elseif (isset($len)) {
            if (0 == $idx && $len == $c) {
                return $this; // ???
                $ids = $this->ids;
            }
            $ids = array_slice($this->ids, $idx, $len, true);
        } else {
            if (0 == $idx) {
                return $this; // ???
                $ids = $this->ids;
            }
            $ids = array_slice($this->ids, $idx, $this->count(), true);
        }
        $o       = new self($this->doc, $ids);
        $o->_ich = &$this->_ich; // share iterator cache for iteration
        return $o;
    }