public byte[] generateClass(Context context, IStrategoTerm file) {
    if (isTermAppl(file)) {
      IStrategoAppl appl = (IStrategoAppl) file;

      if (hasConstructor(appl, FILE_CONS, FILE_ARITY)) {
        IStrategoTerm header = Tools.termAt(appl, 0);
        IStrategoTerm fields = Tools.termAt(appl, 1);
        IStrategoTerm methods = Tools.termAt(appl, 2);

        return generateClass(context, header, fields, methods);
      } else {
        return null;
      }
    } else {
      return null;
    }
  }
  public void visitFields(ClassWriter cw, Context context, IStrategoTerm fields) {
    if (Tools.isTermList(fields)) {
      IStrategoList list = (IStrategoList) fields;

      for (IStrategoTerm field : list) {
        visitField(cw, context, field);
      }
    } else {
      throw new IllegalArgumentException("Invalid FieldSpecs, not a list.");
    }
  }
  public void visitField(ClassWriter cw, Context context, IStrategoTerm field) {
    if (Tools.isTermAppl(field)) {
      IStrategoAppl appl = (IStrategoAppl) field;

      if (hasConstructor(appl, "JBCField", 5)) {
        IStrategoTerm flags = termAt(appl, 0);
        IStrategoTerm name = termAt(appl, 1);
        IStrategoTerm desc = termAt(appl, 2);
        IStrategoTerm sig = termAt(appl, 3);
        IStrategoTerm initial = termAt(appl, 4);

        visitField(cw, context, flags, name, desc, sig, initial);
      } else {
        throw new IllegalArgumentException("Invalid FieldSpec.");
      }
    } else {
      throw new IllegalArgumentException("Invalid FieldSpec.");
    }
  }