private void extractClassProperties( Class<?> clazz, OverridableMethods overridableMethods, ClassContributionTracker classContributionTracker) { AutoProperty autoProperty = clazz.getAnnotation(AutoProperty.class); final DefaultPojomaticPolicy classPolicy = (autoProperty != null) ? autoProperty.policy() : null; final AutoDetectPolicy autoDetectPolicy = (autoProperty != null) ? autoProperty.autoDetect() : null; Map<PropertyRole, Map<String, PropertyElement>> fieldsMap = extractFields( clazz, classPolicy, autoDetectPolicy, classContributionTracker); Map<PropertyRole, Map<String, PropertyElement>> methodsMap = extractMethods( clazz, classPolicy, autoDetectPolicy, overridableMethods, classContributionTracker); if (containsValues(fieldsMap) || containsValues(methodsMap)) { PropertyClassVisitor propertyClassVisitor = PropertyClassVisitor.visitClass(clazz, fieldsMap, methodsMap); if (propertyClassVisitor != null) { for (PropertyRole role: PropertyRole.values()) { properties.get(role).addAll(propertyClassVisitor.getSortedProperties().get(role)); } } else { throw new RuntimeException("no class bytes for " + clazz); } } }