@Override
    public Object invoke(Object object, Method method, Object[] params) throws Throwable {
      final boolean needUpdate = myCheckedNames.contains(method.getName());
      try {
        final Object result = method.invoke(myDelegateTable, unwrapParams(params));
        if (result instanceof Library library) {
          return ReflectionUtil.proxy(getClass().getClassLoader(), result instanceof LibraryEx ? LibraryEx.class : Library.class,
                                      new LibraryInvocationHandler(library));
        }
        if (result instanceof LibraryTable.ModifiableModel model) {
          return ReflectionUtil.proxy(getClass().getClassLoader(), LibraryTable.ModifiableModel.class,
                                      new LibraryTableModelInvocationHandler(model));
        }
        if (result instanceof Library[] libraries) {
          for (int idx = 0; idx < libraries.length; idx++) {
            Library library = libraries[idx];
            libraries[idx] =
              ReflectionUtil.proxy(getClass().getClassLoader(), library instanceof LibraryEx ? LibraryEx.class : Library.class,
                                   new LibraryInvocationHandler(library));
          }
        }
        return result;
      }
      catch (InvocationTargetException e) {
        throw e.getCause();
      }
      finally {
        if (needUpdate) {
          updateOrderEntriesInEditors(true);
        }
      }
    }
@Override
    public Object invoke(Object object, Method method, Object[] params)