public DozerPropertyDescriptor getPropertyDescriptor(Class<?> clazz, String theGetMethod, String theSetMethod,
                                                         String mapGetMethod, String mapSetMethod, boolean isAccessible,
                                                         boolean isIndexed, int index, String name, String key, boolean isSelfReferencing,
                                                         String oppositeFieldName, HintContainer srcDeepIndexHintContainer,
                                                         HintContainer destDeepIndexHintContainer, String beanFactory,
                                                         BeanContainer beanContainer, DestBeanCreator destBeanCreator) {
        DozerPropertyDescriptor desc = null;

        // Raw Map types or custom map-get-method/set specified
        boolean isMapProperty = MappingUtils.isSupportedMap(clazz);
        if (name.equals(DozerConstants.SELF_KEYWORD) &&
            (mapSetMethod != null || mapGetMethod != null || isMapProperty)) {

            // If no mapSetMethod is defined, default to "put"
            String setMethod = StringUtils.isBlank(mapSetMethod) ? "put" : mapSetMethod;

            // If no mapGetMethod is defined, default to "get".
            String getMethod = StringUtils.isBlank(mapGetMethod) ? "get" : mapGetMethod;

            desc = new MapPropertyDescriptor(clazz, name, isIndexed, index, setMethod,
                                             getMethod, key != null ? key : oppositeFieldName,
                                             srcDeepIndexHintContainer, destDeepIndexHintContainer, beanContainer, destBeanCreator);

            // Copy by reference(Not mapped backed properties which also use 'this'
            // identifier for a different purpose)
        } else if (isSelfReferencing) {
            desc = new SelfPropertyDescriptor(clazz);

            // Access field directly and bypass getter/setters
        } else if (isAccessible) {
            desc = new FieldPropertyDescriptor(clazz, name, isIndexed, index, srcDeepIndexHintContainer, destDeepIndexHintContainer, destBeanCreator);

            // Custom get-method/set specified
        } else if (theSetMethod != null || theGetMethod != null) {
            desc = new CustomGetSetPropertyDescriptor(clazz, name, isIndexed, index, theSetMethod, theGetMethod,
                                                      srcDeepIndexHintContainer, destDeepIndexHintContainer, beanContainer, destBeanCreator);

            // If this object is an XML Bean - then use the XmlBeanPropertyDescriptor
        } else if (beanFactory != null && beanFactory.equals(DozerConstants.XML_BEAN_FACTORY)) {
            desc = new XmlBeanPropertyDescriptor(clazz, name, isIndexed, index, srcDeepIndexHintContainer, destDeepIndexHintContainer, beanContainer, destBeanCreator);
        }

        if (desc != null) {
            return desc;
        }

        for (PropertyDescriptorCreationStrategy propertyDescriptorBuilder :
                new CopyOnWriteArrayList<>(pluggedDescriptorCreationStrategies)) {
            if (propertyDescriptorBuilder.isApplicable(clazz, name)) {
                desc = propertyDescriptorBuilder.buildFor(
                        clazz, name, isIndexed, index, srcDeepIndexHintContainer, destDeepIndexHintContainer);
                if (desc != null) {
                    break;
                }
            }
        }

        if (desc == null) {
            // Everything else. It must be a normal bean with normal custom get/set methods
            desc = new JavaBeanPropertyDescriptor(clazz, name, isIndexed, index, srcDeepIndexHintContainer, destDeepIndexHintContainer, beanContainer, destBeanCreator);
        }

        return desc;
    }
Internal factory responsible for determining which property descriptor should
be used. Only intended for internal use.
core/src/main/java/com/github/dozermapper/core/propertydescriptor/PropertyDescriptorFactory.java