<% 
	if (!model.hasEmptySuperclassConstructor()) { 
%>

    /**
     * Default constructor. 
     */
    public <%= model.getClassName() %>() {
        // TODO Auto-generated constructor stub
    }
<% 
	} 

	if (model.shouldGenSuperclassConstructors()) {
		List<Constructor> constructors = model.getConstructors();
		for (Constructor constructor : constructors) {
			if (constructor.isPublic() || constructor.isProtected()) { 
%>
       
    /**
     * @see <%= model.getSuperclassName() %>#<%= model.getSuperclassName() %>(<%= constructor.getParamsForJavadoc() %>)
     */
    public <%= model.getClassName() %>(<%= constructor.getParamsForDeclaration() %>) {
        super(<%= constructor.getParamsForCall() %>);
        // TODO Auto-generated constructor stub
    }
<%
			} 
		} 
	} 
%>