class AfterJoinImpl<T4>
        extends BaseAfterJoin<T4, JoinBuilder5<T0, T1, T2, T3, T4>>
        implements AfterJoin<T0, T1, T2, T3, T4> {

        private AfterJoinImpl(StageBean<T4> stageBean) {
            super(JoinBuilder4Impl.this, stageBean, JoinBuilder5Impl::new);
        }

    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> Join<T> build(QuadFunction<T0, T1, T2, T3, T> constructor) {<FILL_FUNCTION_BODY>

        requireNonNull(constructor);
        final List<Stage<?>> stages = stages();
        return streamSuppler().createJoin(
            stages,
            constructor,
            (TableIdentifier<T0>) stages.get(0).identifier(),
            (TableIdentifier<T1>) stages.get(1).identifier(),
            (TableIdentifier<T2>) stages.get(2).identifier(),
            (TableIdentifier<T3>) stages.get(3).identifier()
        );
    
<methods>public JoinBuilder4<T0,T1,T2,T3> where(Predicate<? super T3>) <variables>private static final com.speedment.common.logger.Logger LOGGER_JOIN,private final non-sealed StageBean<T3> stageBean,private final non-sealed List<StageBean<?>> stageBeans,private final non-sealed com.speedment.runtime.join.JoinStreamSupplierComponent streamSupplier