<% 
	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
    }
<%
			} 
		} 
	} 
%>