docs: def get_attrs(cls):
          """
          Get all class attributes ordered by definition
          """
          ignore = dir(type('dummy', (object,), {})) + ['__metaclass__']
          attrs = [
              item for item in inspect.getmembers(cls) if item[0] not in ignore
              and not isinstance(
                  item[1], (
                      types.FunctionType,
                      types.MethodType,
                      classmethod,
                      staticmethod,
                      property))]
          # sort by idx and use attribute name to break ties
          attrs.sort(key=lambda attr: (getattr(attr[1], 'idx', -1), attr[0]))
          return attrs