<%
	if (model.shouldImplementAbstractMethods()) {
		for (Method method : model.getUnimplementedMethods()) { 
%>

	/**
     * @see <%= method.getContainingJavaClass() %>#<%= method.getName() %>(<%= method.getParamsForJavadoc() %>)
     */
    public <%= method.getReturnType() %> <%= method.getName() %>(<%= method.getParamsForDeclaration() %>) {
        // TODO Auto-generated method stub
<% 
			String defaultReturnValue = method.getDefaultReturnValue();
			if (defaultReturnValue != null) { 
%>
			return <%= defaultReturnValue %>;
<%
			} 
%>
    }
<% 
		}
	} 
%>