/** {@inheritDoc} */
  @Override
  public void header(final ParserContext context) {
    out.println("package " + context.getPackageName() + ";");
    if (!context.getImports().isEmpty()) {
      out.println();
      for (final String importPackage : context.getImports()) {
        out.println("import " + importPackage + ";");
      }
    }
    out.println();
    out.println("/**");
    out.println(format(" * %s template.", context.getClassName()));
    out.println(" */");
    out.println("public class " + context.getClassName() + " {");

    out.println();
    out.println("    /**");
    out.println(format("     * Generates %s template.", context.getClassName()));
    out.println("     *");
    out.println("     * @param arguments");
    out.println("     *            arguments");
    out.println("     * @return generated template");
    out.println("     */");
    out.println(
        format(
            "    public String generate(final %s arguments) {", context.getArgumentsClassName()));
    out.println("        final java.io.StringWriter w = new java.io.StringWriter();");
    out.println("        generate(arguments, w);");
    out.println("        return w.toString();");
    out.println("    }");

    out.println();
    out.println("    /**");
    out.println(
        format("     * Writes %s template to a {@link java.io.Writer}.", context.getClassName()));
    out.println("     *");
    out.println("     * @param arguments");
    out.println("     *            arguments");
    out.println("     * @param writer");
    out.println("     *            writer to output to");
    out.println("     */");
    out.println(
        format(
            "    public void generate(final %s arguments, final java.io.Writer writer) {",
            context.getArgumentsClassName()));
    out.println("        final java.io.PrintWriter out = new java.io.PrintWriter(writer);");
  }