needs `@api private`