class UnaryMethodHandlerSupplier extends AbstractMethodHandlerSupplier {

    @Override
    public <ReqT, RespT> MethodHandler<ReqT, RespT> get(String methodName, AnnotatedMethod method, Supplier<?> instance) {
        if (!isRequiredMethodType(method)) {
            throw new IllegalArgumentException("Method not annotated as a unary method: " + method);
        }

        CallType type = determineCallType(method);
        MethodHandler<ReqT, RespT> handler;

        switch (type) {
        case requestResponse:
            handler = new RequestResponse<>(methodName, method, instance);
            break;
        case responseOnly:
            handler = new ResponseOnly<>(methodName, method, instance);
            break;
        case requestNoResponse:
            handler = new RequestNoResponse<>(methodName, method, instance);
            break;
        case noRequestNoResponse:
            handler = new NoRequestNoResponse<>(methodName, method, instance);
            break;
        case futureResponse:
            handler = new FutureResponse<>(methodName, method, instance);
            break;
        case futureResponseNoRequest:
            handler = new FutureResponseNoRequest<>(methodName, method, instance);
            break;
        case unary:
            handler = new Unary<>(methodName, method, instance);
            break;
        case unaryRequest:
            handler = new UnaryNoRequest<>(methodName, method, instance);
            break;
        case unaryFuture:
            handler = new UnaryFuture<>(methodName, method, instance);
            break;
        case unaryFutureNoRequest:
            handler = new UnaryFutureNoRequest<>(methodName, method, instance);
            break;
        case unknown:
        default:
            throw new IllegalArgumentException("Not a supported unary method signature: " + method);
        }
        return handler;
    }

    public  UnaryMethodHandlerSupplier();

}