static @NotNull <T> T createMulticaster(@NotNull Class<T> listenerClass,
                                          @Nullable Map<String, Object> methodReturnValues,
                                          @NotNull Supplier<? extends Iterable<T>> listeners) {
    LOG.assertTrue(listenerClass.isInterface(), "listenerClass must be an interface: " + listenerClass.getName());
    return ReflectionUtil.proxy(listenerClass, (proxy, method, args) -> {
      String methodName = method.getName();
      if (method.getDeclaringClass().getName().equals("java.lang.Object")) {
        return handleObjectMethod(proxy, args, methodName);
      }
      else if (methodReturnValues != null && methodReturnValues.containsKey(methodName)) {
        return methodReturnValues.get(methodName);
      }
      else {
        dispatchVoidMethod(listeners.get(), method, args);
        return null;
      }
    });
  }
static @NotNull <T> T createMulticaster(@NotNull Class<T> listenerClass,
                                          @Nullable Map<String, Object> methodReturnValues,
                                          @NotNull Supplier<? extends Iterable<T>> listeners)