class BinaryJoiningExpressionImpl<T> implements JoiningExpression<T> {

    private final CharSequence separator;
    private final CharSequence prefix;
    private final CharSequence suffix;
    private final ToString<T> first;
    private final ToString<T> second;

    public BinaryJoiningExpressionImpl(
            final CharSequence separator,
            final CharSequence prefix,
            final CharSequence suffix,
            final ToString<T> first,
            final ToString<T> second) {
        this.separator = requireNonNull(separator);
        this.prefix    = requireNonNull(prefix);
        this.suffix    = requireNonNull(suffix);
        this.first     = requireNonNull(first);
        this.second    = requireNonNull(second);
    }

    @Override
    public List<ToString<T>> expressions() {
        return Arrays.asList(first, second);
    }

    @Override
    public CharSequence prefix() {
        return prefix;
    }

    @Override
    public CharSequence suffix() {
        return suffix;
    }

    @Override
    public CharSequence separator() {
        return separator;
    }

    @Override
    public String apply(T object) {<FILL_FUNCTION_BODY>}
}

        final StringJoiner joiner = new StringJoiner(separator, prefix, suffix);
        joiner.add(first.apply(object));
        joiner.add(second.apply(object));
        return joiner.toString();
    
<no_super_class>