code: def add(self, module, **kwargs):
          
          self._modules.append(module)
  
          # a sanity check to avoid typo
          for key in kwargs:
              assert key in self._meta_keys, ('Unknown meta "%s", a typo?' % key)
  
          self._metas.append(kwargs)
  
          # after adding new modules, we are reset back to raw states, needs
          # to bind, init_params, etc.
          self.binded = False
          self.params_initialized = False
          self.optimizer_initialized = False
  
          return self
docs: Add a module to the chain.
  
          Parameters
          ----------
          module : BaseModule
              The new module to add.
          kwargs : ``**keywords``
              All the keyword arguments are saved as meta information
              for the added module. The currently known meta includes
  
              - `take_labels`: indicating whether the module expect to
                  take labels when doing computation. Note any module in
                  the chain can take labels (not necessarily only the top
                  most one), and they all take the same labels passed
                  from the original data batch for the `SequentialModule`.
  
  
          Returns
          -------
          self
              This function returns `self` to allow us to easily chain a
              series of `add` calls.
          Examples
          --------
          >>> # An example of addinging two modules to a chain.
          >>> seq_mod = mx.mod.SequentialModule()
          >>> seq_mod.add(mod1)
          >>> seq_mod.add(mod2)