docs: protected void discover(final Mapper mapper) {
          for (final Class<? extends Annotation> c : INTERESTING_ANNOTATIONS) {
              addAnnotation(c);
          }
  
          Class<?> superclass = clazz.getSuperclass();
          if (superclass != null && !superclass.equals(Object.class)) {
              superClass = mapper.getMappedClass(superclass);
          }
          for (Class<?> aClass : clazz.getInterfaces()) {
              interfaces.add(mapper.getMappedClass(aClass));
          }
  
          final List<Class<?>> lifecycleClasses = new ArrayList<Class<?>>();
          lifecycleClasses.add(clazz);
  
          final EntityListeners entityLisAnn = (EntityListeners) getAnnotation(EntityListeners.class);
          if (entityLisAnn != null && entityLisAnn.value().length != 0) {
              Collections.addAll(lifecycleClasses, entityLisAnn.value());
          }
  
          for (final Class<?> cls : lifecycleClasses) {
              for (final Method m : ReflectionUtils.getDeclaredAndInheritedMethods(cls)) {
                  for (final Class<? extends Annotation> c : LIFECYCLE_ANNOTATIONS) {
                      if (m.isAnnotationPresent(c)) {
                          addLifecycleEventMethod(c, m, cls.equals(clazz) ? null : cls);
                      }
                  }
              }
          }
  
          update();
  
          for (final java.lang.reflect.Field field : ReflectionUtils.getDeclaredAndInheritedFields(clazz, true)) {
              field.setAccessible(true);
              final int fieldMods = field.getModifiers();
              if (!isIgnorable(field, fieldMods, mapper)) {
                  if (field.isAnnotationPresent(Id.class)) {
                      persistenceFields.add(new MappedField(field, clazz, mapper));
                      update();
                  } else if (field.isAnnotationPresent(Property.class)
                             || field.isAnnotationPresent(Reference.class)
                             || field.isAnnotationPresent(Embedded.class)
                             || field.isAnnotationPresent(Serialized.class)
                             || isSupportedType(field.getType())
                             || ReflectionUtils.implementsInterface(field.getType(), Serializable.class)) {
                      persistenceFields.add(new MappedField(field, clazz, mapper));
                  } else {
                      if (mapper.getOptions().getDefaultMapper() != null) {
                          persistenceFields.add(new MappedField(field, clazz, mapper));
                      } else if (LOG.isWarnEnabled()) {
                          LOG.warn(format("Ignoring (will not persist) field: %s.%s [type:%s]", clazz.getName(), field.getName(),
                                             field.getType().getName()));
                      }
                  }
              }
          }
      }