@Override
    public final Optional<Argument> find(String name, StatementContext ctx) {
        if (name.startsWith(prefix)) {
            final String actualName = name.substring(prefix.length());

            int separator = actualName.indexOf('.');

            if (separator != -1) {
                String parentName = actualName.substring(0, separator);
                String childName = actualName.substring(separator + 1);

                return childArgumentFinders
                    .computeIfAbsent(parentName.endsWith("?") ? parentName.substring(0, parentName.length() - 1) : parentName, pn ->
                        getValue(pn, ctx).map(typedValue -> getValueNested(typedValue, parentName, childName)))
                    .flatMap(arg -> arg.find(childName, ctx));
            }

            return getValue(actualName, ctx)
                .map(tv -> ctx.findArgumentFor(tv.getType(), tv.getValue())
                    .orElseThrow(() -> new UnableToCreateStatementException(
                        String.format("No argument factory registered for type [%s] for element [%s] on [%s]",
                            tv.getType(),
                            name,
                            obj),
                        ctx)));
        }

        return Optional.empty();
    }
@param prefix an optional prefix (we insert a '.' as a separator)
@param obj the object bind on
core/src/main/java/org/jdbi/v3/core/argument/internal/ObjectPropertyNamedArgumentFinder.java