private void discoverAndIntimateForClassAnnotations (ClassFile classFile, boolean visible, boolean invisible) {
        Set<Annotation> annotations = new HashSet<Annotation>();

        if (visible) {
            AnnotationsAttribute visibleA = (AnnotationsAttribute) classFile.getAttribute(AnnotationsAttribute.visibleTag);
            if (visibleA != null) annotations.addAll(Arrays.asList(visibleA.getAnnotations()));
        }

        if (invisible) {
            AnnotationsAttribute invisibleA = (AnnotationsAttribute) classFile.getAttribute(AnnotationsAttribute.invisibleTag);
            if (invisibleA != null) annotations.addAll(Arrays.asList(invisibleA.getAnnotations()));
        }

        // now tell listeners
        for (Annotation annotation : annotations) {
        	// String versions of listeners
			Set<ClassAnnotationDiscoveryListener> listeners = classAnnotationListeners.get(annotation.getTypeName());
			if (null != listeners) {
    			for (ClassAnnotationDiscoveryListener listener : listeners) {
    				listener.discovered(classFile.getName(), annotation.getTypeName());
    			}
			}
			// Object versions of listeners
			Set<ClassAnnotationObjectDiscoveryListener> olisteners = classAnnotationObjectListeners.get(annotation.getTypeName());
			if (null != olisteners) {
				for (ClassAnnotationObjectDiscoveryListener listener : olisteners) {
					listener.discovered(classFile, annotation);
				}
			}
        }
    }