def METHOD_NAME(self):
    if self.idx >= len(self.content):
        return None
    ident = byte_ord(self.content[self.idx])
    self.idx += 1
    if (ident & 31) == 31:
        # identifier > 30
        ident = 0
        while self.idx < len(self.content):
            t = byte_ord(self.content[self.idx])
            self.idx += 1
            ident = (ident << 7) | (t & 0x7F)
            if not (t & 0x80):
                break
    if self.idx >= len(self.content):
        return None
    # now fetch length
    size = byte_ord(self.content[self.idx])
    self.idx += 1
    if size & 0x80:
        # more complimicated...
        # FIXME: theoretically should handle indefinite-length (0x80)
        t = size & 0x7F
        if self.idx + t > len(self.content):
            return None
        size = util.inflate_long(
            self.content[self.idx : self.idx + t], True
        )
        self.idx += t
    if self.idx + size > len(self.content):
        # can't fit
        return None
    data = self.content[self.idx : self.idx + size]
    self.idx += size
    # now switch on id
    if ident == 0x30:
        # sequence
        return self.decode_sequence(data)
    elif ident == 2:
        # int
        return util.inflate_long(data)
    else:
        # 1: boolean (00 false, otherwise true)
        msg = "Unknown ber encoding type {:d} (robey is lazy)"
        raise BERException(msg.format(ident))