@Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
	AST ast = AST.newAST(AST.JLS4);

	LinkedList<ElementBuilder<CompilationUnit>> worklist = new LinkedList<>();

	Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(Jammable.class);
	for (Element element : elements) {
	    if (isType(element)) {
		TypeElement typeElement = (TypeElement) element;
		JammedType jammedType = new JammedType(typeElement);
		
		log(typeElement, "Processing annotated element [{0}]", typeElement.getQualifiedName());

		List<? extends Element> members = this.processingEnv.getElementUtils().getAllMembers(typeElement);

		log(typeElement, "Processing members [{0}]", members);

		List<ElementInnerClass> fields = new ArrayList<>();
		for (Element member : members) {
		    ElementInnerClass processMember = processMember(ast, elements, element, typeElement, jammedType, members, member);
		    if(processMember != null) {
			fields.add(processMember);
		    }
		}

		log(element, "Adding fully qualified name: " + jammedType.getType().getFullyQualifiedName());
		log(element, "Adding fully qualified name fields: " + fields);

		// add this element to the worklist
		worklist.add(new AbstractElement(element, "be.klo.jamm.demo.generated", jammedType.getType().getFullyQualifiedName(), fields));
		worklist.add(new IElement(element, "be.klo.jamm.demo.generated", jammedType.getType().getFullyQualifiedName()));
		worklist.add(new BaseElement(element, "be.klo.jamm.demo.generated", jammedType.getType().getFullyQualifiedName()));
	    }
	    else {
		log(element, "Only classes and interfaces are supported!");
		throw new RuntimeException("Only classes and interfaces are supported!");
	    }
	}

	for (ElementBuilder<CompilationUnit> builder : worklist) {
	    try {
		log(builder.getOriginatingElement(), "\n\nWriting file [" + builder.getFullyQualifiedName() + "]");
		CompilationUnit cu = builder.buildElement(ast);

		String body = cu.toString();
		String formattedCode = formatCode(body);

		JavaFileObject createSourceFile = processingEnv.getFiler().createSourceFile(builder.getFullyQualifiedName(), builder.getOriginatingElement());
		Writer openWriter = createSourceFile.openWriter();
		openWriter.append(formattedCode);
		openWriter.close();
	    }
	    catch (Exception e) {
		e.printStackTrace();
		log(builder.getOriginatingElement(), "Error writing file[" + builder.getFullyQualifiedName() + "]: " + e.getMessage());
	    }
	}

	return true; // no further processing of this annotation type
    }