ProductSwitch.from(hausratVertrag).matchingBy(HausratDeckungstyp.class, HausratDeckungstyp.PROPERTY_DECKUNGS_ART).to(hausratKompakt2023);
// oder für komplexere Betrachtungen der Objektstruktur
ProductSwitch
    .from(hausratVertrag)
    .switchAt(IpsModel.getPolicyCmptType(HausratVertrag.class).getAssociation(HausratVertrag.ASSOCIATION_HAUSRATZUSATZDECKUNG),
        new AdvancedProductFinder() {
            @Override
            public ProductFinderResult findMatchingProduct(IConfigurableModelObject parent,
                IProductComponent oldParentProdCmpt,
                IConfigurableModelObject child,
                PolicyAssociation parentToChild) {
                    if(((HausratVertrag)parent).includesEbikes()){
                        return eBikeDeckungsTyp;
                    } else {
                        return standardRadlDeckungsTyp;
                    }
                }
            })
    .elseUseDefault()
    .to(hausratKompakt2023);
// gerne natürlich auch als Lambda
ProductSwitch
    .from(hausratVertrag)
    .switchAt(IpsModel.getPolicyCmptType(HausratVertrag.class).getAssociation(HausratVertrag.ASSOCIATION_HAUSRATZUSATZDECKUNG),
        (parent, oldParentProdCmpt, child, parentToChild) -> ((HausratVertrag)parent).includesEbikes()) ? eBikeDeckungsTyp : standardRadlDeckungsTyp)
    .elseUseDefault()
    .to(hausratKompakt2023);Produktwechsel
Erweiterte Produktfinder
Genügt die Defaultimplementierung nicht, können unterschiedliche eigene Implementierungen zum Finden des passenden Wechselziels mitgegeben werden, z.B. anhand eines Attributswertes:
Weitere Varianten werden im Javadoc von ProductSwitch und den zugehörigen Klassen beschrieben.