def all_subclasses(base_class):
    """
    Scan recursively for all subclasses of a base class.
    `base_class`: the base class to scan for subclasses
    return: a set of subclasses type information
    """
    return set(base_class.__subclasses__()).union([s for c in base_class.__subclasses__() for s in all_subclasses(c)])