@Override
  public void VisitClassNode(ZClassNode Node) {
    this.CurrentBuilder.Append("sub _Init", this.NameClass(Node.ClassType), "{");
    this.CurrentBuilder.Indent();
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("%o = shift", this.SemiColon);

    @Var ZType SuperType = Node.ClassType.GetSuperType();
    if (!SuperType.Equals(ZClassType._ObjectType)) {
      this.CurrentBuilder.AppendNewLine();
      this.CurrentBuilder.Append("_Init" + this.NameClass(SuperType) + "(%o);");
    }
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("$o{", this.ClassKey(Node.ClassType), "} = ");
    this.CurrentBuilder.AppendInt(Node.ClassType.TypeId);
    this.CurrentBuilder.Append(this.SemiColon);
    @Var int i = 0;
    while (i < Node.GetListSize()) {
      @Var ZFieldNode FieldNode = Node.GetFieldNode(i);
      this.CurrentBuilder.AppendNewLine();
      this.CurrentBuilder.Append("$o{", LibZen._QuoteString(FieldNode.GetName()), "} = ");
      this.GenerateCode(null, FieldNode.InitValueNode());
      this.CurrentBuilder.Append(this.SemiColon);
      i = i + 1;
    }

    i = 0;
    while (i < Node.ClassType.GetFieldSize()) {
      @Var ZClassField ClassField = Node.ClassType.GetFieldAt(i);
      if (ClassField.FieldType.IsFuncType()) {
        this.CurrentBuilder.AppendNewLine();
        this.CurrentBuilder.Append(
            "if (defined $", this.NameMethod(Node.ClassType, ClassField.FieldName), ") {");
        this.CurrentBuilder.Indent();
        this.CurrentBuilder.AppendNewLine();
        this.CurrentBuilder.Append("$o{", LibZen._QuoteString(ClassField.FieldName), "} = $");
        this.CurrentBuilder.Append(
            this.NameMethod(Node.ClassType, ClassField.FieldName), this.SemiColon);
        this.CurrentBuilder.UnIndent();
        this.CurrentBuilder.AppendNewLine();
        this.CurrentBuilder.Append("}");
      }
      i = i + 1;
    }
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.UnIndent();
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("}");
    this.CurrentBuilder.AppendLineFeed();
    this.CurrentBuilder.AppendLineFeed();

    this.CurrentBuilder.Append("sub _New", this.NameClass(Node.ClassType), " {");
    this.CurrentBuilder.Indent();
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("%o = {}", this.SemiColon);
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("_Init" + this.NameClass(Node.ClassType) + "(%o);");
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("return %o;");
    this.CurrentBuilder.UnIndent();
    this.CurrentBuilder.AppendNewLine();
    this.CurrentBuilder.Append("}");
    this.CurrentBuilder.AppendLineFeed();
    this.CurrentBuilder.AppendLineFeed();
  }
 private String ClassKey(ZType ClassType) {
   return LibZen._QuoteString(this.NameClass(ClassType));
 }