docs: private Method[] getMethodsToProxyRecursive() {
          Set<MethodSetEntry> methodsToProxy = new HashSet<>();
          Set<MethodSetEntry> seenFinalMethods = new HashSet<>();
          // Traverse the class hierarchy to ensure that all concrete methods (which could be marked
          // as final) are visited before any abstract methods from interfaces.
          for (Class<?> c = baseClass; c != null; c = c.getSuperclass()) {
              getMethodsToProxy(methodsToProxy, seenFinalMethods, c);
          }
          // Now traverse the interface hierarchy, starting with the ones implemented by the class,
          // followed by any extra interfaces.
          for (Class<?> c = baseClass; c != null; c = c.getSuperclass()) {
              for (Class<?> i : c.getInterfaces()) {
                  getMethodsToProxy(methodsToProxy, seenFinalMethods, i);
              }
          }
          for (Class<?> c : interfaces) {
              getMethodsToProxy(methodsToProxy, seenFinalMethods, c);
          }
  
          Method[] results = new Method[methodsToProxy.size()];
          int i = 0;
          for (MethodSetEntry entry : methodsToProxy) {
              results[i++] = entry.originalMethod;
          }
  
          return results;
      }