content: package com.alibaba.fastjson.codegen;
  
  import java.io.IOException;
  import java.lang.reflect.Type;
  
  public abstract class ClassGen {
  
      protected Class<?>   clazz;
      protected Type       type;
      protected Appendable out;
  
      private String       indent      = "\t";
      private int          indentCount = 0;
  
      public ClassGen(Class<?> clazz, Appendable out){
          this(clazz, null, out);
      }
  
      public ClassGen(Class<?> clazz, Type type, Appendable out){
          this.clazz = clazz;
          this.type = type;
          this.out = out;
      }
  
      public abstract void gen() throws IOException;
  
      protected void println() throws IOException {
          out.append("\n");
          printIndent();
      }
  
      protected void println(String text) throws IOException {
          out.append(text);
          out.append("\n");
          printIndent();
      }
  
      protected void print(String text) throws IOException {
          out.append(text);
      }
  
      protected void printPackage() throws IOException {
          print("package ");
          print(clazz.getPackage().getName());
          println(";");
      }
  
      protected void beginClass(String className) throws IOException {
          print("public class ");
          print(className);
          print(" implements ObjectDeserializer {");
          incrementIndent();
          println();
      }
  
      protected void endClass() throws IOException {
          decrementIndent();
          println();
          print("}");
          println();
      }
  
      protected void genField(String name, Class<?> feildClass) throws IOException {
          if (feildClass == char[].class) {
              print("char[]");
          }
  
          print(" ");
          print(name);
          println(";");
      }
  
      protected void beginInit(String className) throws IOException {
          print("public ");
          print(className);
          println(" () {");
          incrementIndent();
      }
  
      protected void endInit() throws IOException {
          decrementIndent();
          print("}");
          println();
      }
      
      public void decrementIndent() {
          this.indentCount -= 1;
      }
  
      public void incrementIndent() {
          this.indentCount += 1;
      }
  
      public void printIndent() throws IOException {
          for (int i = 0; i < this.indentCount; ++i) {
              print(this.indent);
          }
      }
      
      protected void printClassName(Class<?> clazz) throws IOException {
          String name = clazz.getName();
          name = name.replace('$', '.');
          print(name);
      }
  }
  