public static boolean typeIsAssignableFrom(PsiClass from, String... toFQN) {
    if (from == null) return false;

    Set<String> matching = new HashSet<String>(Arrays.asList(toFQN));
    PsiClass cls = from;
    do {
      if (matching.contains(cls.getQualifiedName())) return true;
      for (PsiClass interfaceClass : cls.getInterfaces()) {
        if (typeIsAssignableFrom(interfaceClass, toFQN)) {
          return true;
        }
      }
    } while ((cls = cls.getSuperClass()) != null);

    return false;
  }