code: def add_middleware(self, middleware, *, before=None, after=None):
          
          assert not (before and after), \
              "provide either 'before' or 'after', but not both"
  
          if before or after:
              for i, m in enumerate(self.middleware):  # noqa
                  if isinstance(m, before or after):
                      break
              else:
                  raise ValueError("Middleware %r not found" % (before or after))
  
              if before:
                  self.middleware.insert(i, middleware)
              else:
                  self.middleware.insert(i + 1, middleware)
          else:
              self.middleware.append(middleware)
  
          self.actor_options |= middleware.actor_options
  
          for actor_name in self.get_declared_actors():
              middleware.after_declare_actor(self, actor_name)
  
          for queue_name in self.get_declared_queues():
              middleware.after_declare_queue(self, queue_name)
  
          for queue_name in self.get_declared_delay_queues():
              middleware.after_declare_delay_queue(self, queue_name)
docs: Add a middleware object to this broker.  The middleware is
          appended to the end of the middleware list by default.
  
          You can specify another middleware (by class) as a reference
          point for where the new middleware should be added.
  
          Parameters:
            middleware(Middleware): The middleware.
            before(type): Add this middleware before a specific one.
            after(type): Add this middleware after a specific one.
  
          Raises:
            ValueError: When either ``before`` or ``after`` refer to a
              middleware that hasn't been registered yet.