public final This bindMethodsList(String key, Iterable<?> values, List<String> methodNames) {
        final Iterator<?> valueIter = values.iterator();
        if (!valueIter.hasNext()) {
            throw new IllegalArgumentException(
                getClass().getSimpleName() + ".bindMethodsList was called with no values.");
        }

        if (methodNames.isEmpty()) {
            throw new IllegalArgumentException(
                getClass().getSimpleName() + ".bindMethodsList was called with no values.");
        }

        final StringBuilder names = new StringBuilder();
        final StatementContext ctx = getContext();
        for (int valueIndex = 0; valueIter.hasNext(); valueIndex++) {
            if (valueIndex > 0) {
                names.append(',');
            }

            final Object bean = valueIter.next();
            final ObjectMethodArguments beanMethods = new ObjectMethodArguments(null, bean);

            names.append('(');
            for (int methodIndex = 0; methodIndex < methodNames.size(); methodIndex++) {
                if (methodIndex > 0) {
                    names.append(',');
                }

                final String methodName = methodNames.get(methodIndex);
                final String name = key + valueIndex + '.' + methodName;
                names.append(':').append(name);
                final Argument argument = beanMethods.find(methodName, ctx)
                    .orElseThrow(() -> new UnableToCreateStatementException("Unable to get " + methodName + " argument for " + bean, ctx));
                bind(name, argument);
            }
            names.append(')');
        }

        return define(key, names.toString());
    }
For each value given, create a tuple by invoking each given method in order, and bind the tuple into
a {@code VALUES (...)} format insert clause.
@param key attribute name
@param values list of values that will be comma-spliced into the defined attribute value
@param methodNames list of methods that will be invoked on the values
@return this
@throws IllegalArgumentException if the list of values or properties is empty.
@throws UnableToCreateStatementException if the method cannot be found
@see #bindList(BiConsumer, String, List)
core/src/main/java/org/jdbi/v3/core/statement/SqlStatement.java