@NonNull
    public RouterFunction<ServerResponse> create() {
        var getHandler = new ExtensionGetHandler(scheme, client);
        var listHandler = new ExtensionListHandler(scheme, client);
        var createHandler = new ExtensionCreateHandler(scheme, client);
        var updateHandler = new ExtensionUpdateHandler(scheme, client);
        var deleteHandler = new ExtensionDeleteHandler(scheme, client);
        var patchHandler = new ExtensionPatchHandler(scheme, client);
        // TODO More handlers here
        var gvk = scheme.groupVersionKind();
        var kind = gvk.kind();
        var tagName = gvk.kind() + StringUtils.capitalize(gvk.version());
        return SpringdocRouteBuilder.route()
            .GET(getHandler.pathPattern(), getHandler,
                builder -> builder.operationId("get" + kind)
                    .description("Get " + kind)
                    .tag(tagName)
                    .parameter(parameterBuilder().in(ParameterIn.PATH)
                        .name("name")
                        .description("Name of " + scheme.singular()))
                    .response(responseBuilder().responseCode("200")
                        .description("Response single " + scheme.singular())
                        .implementation(scheme.type())))
            .GET(listHandler.pathPattern(), listHandler,
                builder -> {
                    builder.operationId("list" + kind)
                        .description("List " + kind)
                        .tag(tagName)
                        .response(responseBuilder().responseCode("200")
                            .description("Response " + scheme.plural())
                            .implementation(ListResult.generateGenericClass(scheme)));
                    SortableRequest.buildParameters(builder);
                })
            .POST(createHandler.pathPattern(), createHandler,
                builder -> builder.operationId("create" + kind)
                    .description("Create " + kind)
                    .tag(tagName)
                    .requestBody(requestBodyBuilder()
                        .description("Fresh " + scheme.singular())
                        .implementation(scheme.type()))
                    .response(responseBuilder().responseCode("200")
                        .description("Response " + scheme.plural() + " created just now")
                        .implementation(scheme.type())))
            .PUT(updateHandler.pathPattern(), updateHandler,
                builder -> builder.operationId("update" + kind)
                    .description("Update " + kind)
                    .tag(tagName)
                    .parameter(parameterBuilder().in(ParameterIn.PATH)
                        .name("name")
                        .description("Name of " + scheme.singular()))
                    .requestBody(requestBodyBuilder()
                        .description("Updated " + scheme.singular())
                        .implementation(scheme.type()))
                    .response(responseBuilder().responseCode("200")
                        .description("Response " + scheme.plural() + " updated just now")
                        .implementation(scheme.type())))
            .PATCH(patchHandler.pathPattern(), patchHandler,
                builder -> builder.operationId("patch" + kind)
                    .description("Patch " + kind)
                    .tag(tagName)
                    .parameter(parameterBuilder().in(ParameterIn.PATH)
                        .name("name")
                        .description("Name of " + scheme.singular()))
                    .requestBody(requestBodyBuilder()
                        .content(contentBuilder()
                            .mediaType("application/json-patch+json")
                            .schema(
                                schemaBuilder().ref(RefUtils.constructRef(JsonPatch.SCHEMA_NAME))
                            )
                        )
                    )
                    .response(responseBuilder().responseCode("200")
                        .description("Response " + scheme.singular() + " patched just now")
                        .implementation(scheme.type())
                    )
            )
            .DELETE(deleteHandler.pathPattern(), deleteHandler,
                builder -> builder.operationId("delete" + kind)
                    .description("Delete " + kind)
                    .tag(tagName)
                    .parameter(parameterBuilder().in(ParameterIn.PATH)
                        .name("name")
                        .description("Name of " + scheme.singular()))
                    .response(responseBuilder().responseCode("200")
                        .description("Response " + scheme.singular() + " deleted just now")))
            .build();
    }
@Test
    void shouldCreateSuccessfully() {
        var routerFunction = factory.create();

        testCases().forEach(testCase -> {
            List<HttpMessageReader<?>> messageReaders =
                HandlerStrategies.withDefaults().messageReaders();
            var request = ServerRequest.create(testCase.webExchange, messageReaders);
            var handlerFunc = routerFunction.route(request).block();
            assertInstanceOf(testCase.expectHandlerType, handlerFunc);
        });
    }