docs: @Override
      boolean changingSuperAllowed(T oldSuperType, T newSuperType) {
          boolean changingSuperAllowed = super.changingSuperAllowed(oldSuperType, newSuperType);
          if (changingSuperAllowed && oldSuperType != null && !Schema.MetaSchema.isMetaLabel(oldSuperType.label())) {
              //noinspection unchecked
              Set<Role> superPlays = oldSuperType.playing().collect(Collectors.toSet());
  
              //Get everything that this can play bot including the supers
              Set<Role> plays = new HashSet<>(directPlays().keySet());
              subs().flatMap(sub -> TypeImpl.from(sub).directPlays().keySet().stream()).forEach(plays::add);
  
              superPlays.removeAll(plays);
  
              //It is possible to be disconnecting from a role which is no longer in use but checking this will take too long
              //So we assume the role is in sure and throw if that is the case
              if (!superPlays.isEmpty() && instancesDirect().findAny().isPresent()) {
                  throw TransactionException.changingSuperWillDisconnectRole(oldSuperType, newSuperType, superPlays.iterator().next());
              }
  
              return true;
          }
          return changingSuperAllowed;
      }