docs: @SuppressWarnings("unchecked")
    public <S, D> TypeMap<S, D> getOrCreate(S source, Class<S> sourceType, Class<D> destinationType,
        String typeMapName, PropertyMap<S, D> propertyMap, Converter<S, D> converter,
        MappingEngineImpl engine) {
      synchronized (lock) {
        TypePair<S, D> typePair = TypePair.of(sourceType, destinationType, typeMapName);
        TypeMapImpl<S, D> typeMap = (TypeMapImpl<S, D>) typeMaps.get(typePair);
  
        if (typeMap == null) {
          typeMap = new TypeMapImpl<S, D>(sourceType, destinationType, typeMapName, config, engine);
          if (propertyMap != null)
            typeMap.addMappings(propertyMap);
          if (converter == null && config.isImplicitMappingEnabled()
              && Types.mightContainsProperties(typeMap.getSourceType())
              && Types.mightContainsProperties(typeMap.getDestinationType()))
            ImplicitMappingBuilder.build(source, typeMap, config.typeMapStore, config.converterStore);
  
          if (typeMap.isFullMatching()) {
            typeMaps.put(typePair, typeMap);
          }
        } else if (propertyMap != null) {
          typeMap.addMappings(propertyMap);
        }
  
        if (converter != null)
          typeMap.setConverter(converter);
        return typeMap;
      }
    }