public <T> T invoke(Function<OutParameters, T> resultComputer) {
        // it is ok to ignore the PreparedStatement returned here. internalExecute registers it to close with the context and the
        // nullSafeCleanUp below will take care of it.
        internalExecute();

        final Supplier<ResultSet> resultSetSupplier = () -> {
            try {
                return stmt.getResultSet();
            } catch (SQLException e) {
                throw Sneaky.throwAnyway(e);
            }
        };

        final ResultBearing resultSet = ResultBearing.of(ResultSetSupplier.notClosingContext(resultSetSupplier), getContext());

        OutParameters out = new OutParameters(resultSet, getContext());

        outParamArguments.forEach(outparamArgument -> {
            Supplier<Object> supplier = outparamArgument.supplier((CallableStatement) stmt);
            // index is 0 based, position is 1 based.
            out.putValueSupplier(outparamArgument.position - 1, outparamArgument.name, supplier);
        });

        return resultComputer.apply(out);
    }
Invoke the callable statement and process its {@link OutParameters} results,
returning a computed value of type {@code T}.
core/src/main/java/org/jdbi/v3/core/statement/Call.java