public static void gen() {
    Compiler c = new Compiler();
    // VisitorBaseGen baseGen = new VisitorBaseGen(true);
    VisitorBaseGen baseGen = new VisitorBaseGen(false);

    for (int nest = 0; nest <= 1; nest++) {
      for (int len = 1; len <= 3; len++) {
        List<MethodDecl> decls;
        if (nest == 1) {
          decls = getMethodDecls(nest, len, true);
          baseGen.addAll(decls);
        } else {
          decls = getMethodDecls(nest, len, false);
          baseGen.addAll(decls);
        }
      }
    }
    String visitorImpl = VisitorCodeGen.visitorPackage + ".VisitorImpl";
    boolean success = c.compile(visitorImpl, baseGen.generate());
    if (!success) {
      String msg = "Cannot compile VisitorImpl class";
      System.out.println(c.getErrorMsg());
      throw new SociaLiteException(msg);
    }
  }
  public static LinkedHashMap<String, byte[]> generate(Config conf, List<Table> tables) {
    LinkedHashMap<String, byte[]> generatedClasses = new LinkedHashMap<String, byte[]>();
    for (Table t : tables) {
      if (t.numColumns() <= 3) continue;

      MethodDecls decls = new MethodDecls();
      for (int i = 0; i < t.getColumnGroups().size(); i++) {
        ColumnGroup cg = t.getColumnGroups().get(i);
        if (i == 0 && cg.size() <= 3) continue;
        if (i == 1 && cg.size() == 1) continue;

        boolean last = (i == t.getColumnGroups().size() - 1);
        if (last && cg.size() <= 3) continue;

        decls.add(new MethodDecl(cg.columns(), last));
      }
      if (decls.isEmpty()) continue;

      Compiler c = new Compiler(conf.isVerbose());
      VisitorBaseGen baseGen = new VisitorBaseGen(false);
      String fullname = VisitorCodeGen.visitorPackage + "." + baseGen.name();
      t.setVisitorInterface(fullname);
      for (MethodDecl d : decls) baseGen.add(d);
      boolean success = c.compile(fullname, baseGen.generate());
      if (!success) {
        String msg = "Cannot compile " + fullname + ".class";
        throw new SociaLiteException(msg);
      }
      generatedClasses.putAll(c.getCompiledClasses());
    }
    return generatedClasses;
  }