code: def middleware(self, *args, **kwargs):
          
  
          def register_middleware(_middleware):
              future_middleware = FutureMiddleware(_middleware, args, kwargs)
              self.middlewares.append(future_middleware)
              return _middleware
  
          # Detect which way this was called, @middleware or @middleware('AT')
          if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
              middleware = args[0]
              args = []
              return register_middleware(middleware)
          else:
              if kwargs.get("bp_group") and callable(args[0]):
                  middleware = args[0]
                  args = args[1:]
                  kwargs.pop("bp_group")
                  return register_middleware(middleware)
              else:
                  return register_middleware
docs: Create a blueprint middleware from a decorated function.
  
          :param args: Positional arguments to be used while invoking the
              middleware
          :param kwargs: optional keyword args that can be used with the
              middleware.