subtypes.add(child);
}
@Override
public void mergeDefinition(final MappingDefinition def) {
MetaClass cls = def.getMappingClass();
while ((cls = cls.getSuperClass()) != null) {
if (hasDefinition(cls)) {
MappingDefinition toMerge = getDefinition(cls);
Set<String> parentKeys = new HashSet<String>();
for (Mapping m : toMerge.getInstantiationMapping().getMappings())
parentKeys.add(m.getKey());
for (MemberMapping m : toMerge.getMemberMappings())
parentKeys.add(m.getKey());
Iterator<MemberMapping> defMappings = def.getMemberMappings().iterator();
while (defMappings.hasNext()) {
if (parentKeys.contains(defMappings.next().getKey())) defMappings.remove();
}
for (MemberMapping memberMapping : toMerge.getMemberMappings()) {
def.addInheritedMapping(memberMapping);
}
InstantiationMapping instantiationMapping = def.getInstantiationMapping();
if (instantiationMapping instanceof ConstructorMapping &&
def.getInstantiationMapping().getMappings().length == 0 &&
def.getMappingClass().getDeclaredConstructor(toMerge.getInstantiationMapping().getSignature()) != null)
{
final ConstructorMapping parentConstructorMapping = (ConstructorMapping) toMerge.getInstantiationMapping();
final MetaClass mergingClass = def.getMappingClass();
if (parentConstructorMapping instanceof SimpleConstructorMapping) {
ConstructorMapping newMapping = ((SimpleConstructorMapping) parentConstructorMapping)
.getCopyForInheritance();
newMapping.setMappingClass(mergingClass);