/// <summary>determines the mapping for the case, where clsType is a CLS-interface</summary>
 private object CallActionForDNInterface(ref Type clsType, MappingAction action) {
     // distinguish the different cases here
     object[] attrs = clsType.GetCustomAttributes(s_interfaceTypeAttrType, true);
     if (attrs.Length > 1) { 
         // only one InterfaceTypeAttribute for an interface allowed
         throw new INTERNAL(18811, CompletionStatus.Completed_MayBe);
     }
 
     InterfaceTypeAttribute interfaceAttr = null;
     if (attrs.Length > 0) { 
         interfaceAttr = (InterfaceTypeAttribute) attrs[0]; 
     }
     if ((interfaceAttr == null) || (interfaceAttr.IdlType.Equals(IdlTypeInterface.AbstractInterface))) {
         return action.MapToIdlAbstractInterface(clsType);
     } else if (interfaceAttr.IdlType.Equals(IdlTypeInterface.ConcreteInterface)) {
         return action.MapToIdlConcreteInterface(clsType);
     } else if (interfaceAttr.IdlType.Equals(IdlTypeInterface.AbstractValueType)) {
         return action.MapToIdlAbstractValueType(clsType);
     } else if (interfaceAttr.IdlType.Equals(IdlTypeInterface.LocalInterface)) {
         return action.MapToIdlLocalInterface(clsType);
     } else  {
         // ttributte IntrerfaceTypeAttribute had an unknown value for IDLType: interfaceAttr.IdlType
         throw new MARSHAL(18809, CompletionStatus.Completed_MayBe);
     }
 }