public Iterable<OverloadDescriptor> findAllOverloads(final JvmClass cls, Function<? super JvmMethod, JVMFlags> correspondenceFinder) {
    Function<JvmClass, Iterable<OverloadDescriptor>> mapper = c -> filter(map(c.getMethods(), m -> {
      JVMFlags accessScope = correspondenceFinder.apply(m);
      return accessScope != null? new OverloadDescriptor(accessScope, m, c) : null;
    }), notNullFilter());

    return flat(
      flat(map(recurse(cls, cl -> flat(map(cl.getSuperTypes(), st -> getClassesByName(st))), true), cl -> mapper.apply(cl))),
      flat(map(allSubclasses(cls.getReferenceID()), id -> flat(map(getNodes(id, JvmClass.class), cl -> mapper.apply(cl)))))
    );
  }
public Iterable<OverloadDescriptor> findAllOverloads(final JvmClass cls, Function<? super JvmMethod, JVMFlags> correspondenceFinder)