private static boolean isAbstractMethodForClass(
     @NotNull PyFunction method, @NotNull PyClass cls) {
   final String methodName = method.getName();
   if (methodName == null
       || cls.findMethodByName(methodName, false) != null
       || cls.findClassAttribute(methodName, false) != null) {
     return false;
   }
   return PyUtil.isDecoratedAsAbstract(method)
       || PyOverrideImplementUtil.raisesNotImplementedError(method);
 }
 @Override
 public void visitPyClass(PyClass pyClass) {
   if (isAbstract(pyClass)) {
     return;
   }
   final Set<PyFunction> toBeImplemented = new HashSet<PyFunction>();
   final Collection<PyFunction> functions =
       PyOverrideImplementUtil.getAllSuperFunctions(pyClass);
   for (PyFunction method : functions) {
     if (isAbstractMethodForClass(method, pyClass)) {
       toBeImplemented.add(method);
     }
   }
   final ASTNode nameNode = pyClass.getNameNode();
   if (!toBeImplemented.isEmpty() && nameNode != null) {
     registerProblem(
         nameNode.getPsi(),
         PyBundle.message("INSP.NAME.abstract.class.$0.must.implement", pyClass.getName()),
         new PyImplementMethodsQuickFix(pyClass, toBeImplemented));
   }
 }