code: private static void addSuperAndInterfaces(Set<Class<?>> classes, Class<?> clazz) {
          if (clazz != null) {
              classes.add(clazz);
              addSuperAndInterfaces(classes, clazz.getSuperclass());
              for (Class<?> aClass : clazz.getInterfaces()) {
                  addSuperAndInterfaces(classes, aClass);
              }
          }
      }
docs: TODO: breadth first depth first. I guess depth first because of raw type rule selecting first bound.