class ConstructorView
implements Transform<Constructor, String>,
           HasThrowsView<Constructor>,
           HasGenericsView<Constructor>,
           HasFieldsView<Constructor>,
           HasJavadocView<Constructor>,
           HasAnnotationUsageView<Constructor>,
           HasCodeView<Constructor>,
           HasModifiersView<Constructor> {

    @Override
    public String fieldSeparator(Constructor model) {
        if (model.getFields().size() >= 3
        ||  model.getFields().stream()
            .anyMatch(f -> !f.getAnnotations().isEmpty())) {
            return "," + Formatting.nl() + Formatting.tab() + Formatting.tab();
        } else return ", ";
    }

    @Override
    public String throwsSuffix(Constructor model) {
        return " ";
    }

    @Override
	public Optional<String> transform(Generator gen, Constructor model) {<FILL_FUNCTION_BODY>}
	
    /**
     * Renders the name of this constructor. In java, this is the name of the
     * class or enum that the constructor is in.
     * 
     * @param gen    the generator
     * @param model  the constructor
     * @return       the rendered name
     */
	private static <T extends HasName<T>> Optional<String> renderName(Generator gen, Constructor model) {
        requireNonNulls(gen, model);

        return gen.getRenderStack()
            .fromTop(HasName.class)
            .map(HasName<T>::getName)
            .map(Formatting::shortName)
            .findFirst();
	}

    private boolean splitFields(Constructor model) {
        return model.getFields().size() >= 3 || model.getFields().stream()
            .anyMatch(f -> !f.getAnnotations().isEmpty());
    }
}

        requireNonNulls(gen, model);

        return Optional.of(
            renderJavadoc(gen, model) +
            renderAnnotations(gen, model) +
            renderModifiers(gen, model, PUBLIC, PRIVATE, PROTECTED) +
            renderGenerics(gen, model) +
            renderName(gen, model)
                .orElseThrow(() -> new UnsupportedOperationException(
                    "Could not find a nameable parent of constructor."
                )) +
            ((splitFields(model)) ? "(" + Formatting.nl() + Formatting.tab() + Formatting.tab() : "(") +
            renderFields(gen, model) + ") " +
            renderThrows(gen, model) +
            renderCode(gen, model)
        );
	
<no_super_class>