<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def call_async(self, method, **parameters):
 """Makes an async call to the API. :param method: The method name. :param params: Additional parameters to send (for example, search=dict(id='b123') ) :return: The JSON result (decoded into a dict) from the server.abs :raise MyGeotabException: Raises when an exception occurs on the MyGeotab server. :raise TimeoutException: Raises when the request does not respond after some time. """

        if method is None:
            raise Exception('A method name must be specified')
        params = api.process_parameters(parameters)
        if self.credentials and not self.credentials.session_id:
            self.authenticate()
        if 'credentials' not in params and self.credentials.session_id:
            params['credentials'] = self.credentials.get_param()

        try:
            result = await _query(self._server, method, params,
                                  verify_ssl=self._is_verify_ssl, loop=self.loop)
            if result is not None:
                self.__reauthorize_count = 0
            return result
        except MyGeotabException as exception:
            if exception.name == 'InvalidUserException':
                if self.__reauthorize_count == 0 and self.credentials.password:
                    self.__reauthorize_count += 1
                    self.authenticate()
                    return await self.call_async(method, **parameters)
                else:
                    raise AuthenticationException(self.credentials.username,
                                                  self.credentials.database,
                                                  self.credentials.server)
            raise