@Override
  public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    if (roundEnv.processingOver()) {
      // We're not interested in the postprocessing round.
      return false;
    }

    Set<? extends Element> rootElements = roundEnv
        .getElementsAnnotatedWith(SerializableClasses.class);
    for (Element element : rootElements) {

      // We're only interested in packages
      if (element.getKind() != ElementKind.PACKAGE) {
        continue;
      }

      // Get some info on the annotated package
      PackageElement thePackage = elementUtils.getPackageOf(element);
      String packageName = thePackage.getQualifiedName().toString();

      // Test each class in the package for "serializability"
      List<? extends Element> classes = thePackage.getEnclosedElements();
      for (Element theClass : classes) {
        // We're not interested in interfaces
        if (theClass.getKind() == ElementKind.INTERFACE) {
          continue;
        }

        // Check if the class is actually Serializable
        boolean isSerializable = typeUtils.isAssignable(theClass.asType(), serializableType);
        if (!isSerializable) {
          messager.printMessage(Kind.ERROR,
              "SerializableClasses: The following class is not Serializable: " + packageName + "."
                  + theClass.getSimpleName());
        }
      }
    }

    // Prevent other processors from processing this annotation
    return true;
  }