docs: def fetch(self, callback):
          """
          Perform a full synchronization flow.
  
          .. code-block:: python
              :linenos:
  
              >>> client = basecrm.Client(access_token='<YOUR_PERSONAL_ACCESS_TOKEN>')
              >>> sync = basecrm.Sync(client=client, device_uuid='<YOUR_DEVICES_UUID>')
              >>> sync.fetch(lambda meta, data: basecrm.Sync.ACK)
  
          :param callback: Callback that will be called for every item in a queue.
              Takes two input arguments: synchronization meta data and assodicated data.
              It must return either ack or nack.
          """
  
          # Set up a new synchronization session for a given device's UUID
          session = self.client.sync.start(self.device_uuid)
  
          # Check if there is anything to synchronize
          if session is None or 'id' not in session:
              return
  
          # Drain the main queue until there is no more data (empty array)
          while True:
              # Fetch the main queue
              queue_items = self.client.sync.fetch(self.device_uuid, session['id'])
  
              # nothing more to synchronize ?
              if not queue_items:
                  break
  
              # let client know about both data and meta
              ack_keys = []
  
              for item in queue_items:
                  if callback(item['meta'], item['data']):
                      ack_keys.append(item['meta']['sync']['ack_key'])
  
              # As we fetch new data, we need to send acknowledgement keys
              # if any ..
              if ack_keys:
                  self.client.sync.ack(self.device_uuid, ack_keys)