Extracts all values from `self.obj` object addressed with a `selector`.
        Selector can be a ``slice``, or a singular value extractor in form of a
        valid dictionary key (hashable object).
        
        Object (operated on) can be anything with an itemgetter or attrgetter,
        including, but limited to `dict`, and `list`.
        Itemgetter is preferred over attrgetter, except when called as `.key`.
        
        If `selector` is a singular value extractor (like a string, integer,
        etc), a single value (for a given key) is returned if key exists, an
        empty list if not.
        
        If `selector` is a ``slice``, each key from that range is extracted;
        failing-back, again, to an empty list.

def _extract_from_object(self, selector):
        """Extracts all values from `self.obj` object addressed with a `selector`.
        Selector can be a ``slice``, or a singular value extractor in form of a
        valid dictionary key (hashable object).
        
        Object (operated on) can be anything with an itemgetter or attrgetter,
        including, but limited to `dict`, and `list`.
        Itemgetter is preferred over attrgetter, except when called as `.key`.
        
        If `selector` is a singular value extractor (like a string, integer,
        etc), a single value (for a given key) is returned if key exists, an
        empty list if not.
        
        If `selector` is a ``slice``, each key from that range is extracted;
        failing-back, again, to an empty list.
        """
        if isinstance(selector, slice):
            # we must expand the slice manually, in order to be able to apply to
            # for example, to mapping types, or general objects
            # (e.g. slice `4::2` will filter all even numerical keys/attrs >=4)
            start = selector.start or 0
            step = selector.step or 1
            if selector.stop is None:
                if hasattr(self.obj, "keys"):
                    # filter keys by slice
                    keys = \
                        [k for k in self.obj.keys() if isinstance(k, baseinteger) \
                            and k >= start and (k - start) % step == 0]
                elif hasattr(self.obj, "__len__"):
                    # object we slice should have a length (__len__ method),
                    keys = xrange(start, len(self.obj), step)
                else:
                    # otherwise, we don't know how to slice, so just skip it,
                    # instead of failing
                    keys = []
            else:
                keys = xrange(start, selector.stop, step)

        else:
            keys = [selector]
        
        res = []
        for key in keys:
            self._append(self.obj, key, res)
        return res