code: async def connect(self, *args, **kwargs):
          await self.disconnect()
          if 'endpoint' not in kwargs and len(args) < 2:
              if args and 'model_name' in kwargs:
                  raise TypeError('connect() got multiple values for model_name')
              elif args:
                  model_name = args[0]
              else:
                  model_name = kwargs.pop('model_name', None)
              await self._connector.connect_model(model_name, **kwargs)
          else:
              if 'model_name' in kwargs:
                  raise TypeError('connect() got values for both '
                                  'model_name and endpoint')
              if args and 'endpoint' in kwargs:
                  raise TypeError('connect() got multiple values for endpoint')
              if len(args) < 2 and 'uuid' not in kwargs:
                  raise TypeError('connect() missing value for uuid')
              has_userpass = (len(args) >= 4 or
                              {'username', 'password'}.issubset(kwargs))
              has_macaroons = (len(args) >= 6 or not
                               {'bakery_client', 'macaroons'}.isdisjoint(kwargs))
              if not (has_userpass or has_macaroons):
                  raise TypeError('connect() missing auth params')
              arg_names = [
                  'endpoint',
                  'uuid',
                  'username',
                  'password',
                  'cacert',
                  'bakery_client',
                  'macaroons',
                  'loop',
                  'max_frame_size',
              ]
              for i, arg in enumerate(args):
                  kwargs[arg_names[i]] = arg
              if not {'endpoint', 'uuid'}.issubset(kwargs):
                  raise ValueError('endpoint and uuid are required '
                                   'if model_name not given')
              if not ({'username', 'password'}.issubset(kwargs) or
                      {'bakery_client', 'macaroons'}.intersection(kwargs)):
                  raise ValueError('Authentication parameters are required '
                                   'if model_name not given')
              await self._connector.connect(**kwargs)
          await self._after_connect()