def METHOD_NAME(u, structs, *args):
    """Keep constructing structs from the unpackable u until it runs out of data.
    structs should consist of a list of Struct subclasses to be tried in order.
    Each of them should return None from their constructor if they're not the
    correct type to unpack the next chunk of data.  Any catch-all generic
    structure should apepar last in the list.  Raises a StructError if no
    struct matches."""
    def _substructs():
        while not u.at_end():
            for s in structs:
                temp = s(u, *args)
                if temp is not None:
                    yield temp
                    break
            else:
                raise StructError("Internal error: unable to unpack any structure at byte {} of unpackable".format(u.offset))
    return tuple(_substructs())