class_docstr: Credential which represent a sequence of Credentials where front one is exposed to user
      
class_docstr_tok: ["Credential","which","represent","a","sequence","of","Credentials","where","front","one","is","exposed","to","user"]
docstr: Obtain credentials from a keyring and if any is not known -- ask
code: def __call__(self):
      """Obtain credentials from a keyring and if any is not known -- ask"""
      # Start from the tail until we have credentials set
      idx = len(self._credentials) - 1
      for c in self._credentials[::-1]:
          if c.is_known and not c.is_expired:
              break
          idx -= 1
  
      if idx < 0:
          # none was known, all the same -- start with the first one
          idx = 0
  
      # TODO: consider moving logic of traversal into authenticator since it is
      # the one spitting out authentication error etc
      # Theoretically we could just reuse 'fields' from adapter in the next step
      # but let's do full circle, so that if any "normalization" is done by
      # Credentials we take that into account
      for c, adapter, next_c in zip(
          self._credentials[idx:],
          self._CREDENTIAL_ADAPTERS[idx:],
          self._credentials[idx + 1 :],
      ):
          fields = c()
          next_fields = adapter(self, **fields)
          next_c.set(**next_fields)
  
      return self._credentials[-1]()
  
imports: import time
  from ..support.exceptions import AccessDeniedError, CapturedException
  from ..support.keyring_ import keyring
  from ..ui import ui
  from ..utils import auto_repr
  from ..support.network import iso8601_to_epoch
  from datalad import cfg
  from datalad.config import anything2bool
  from datalad.distribution.dataset import Dataset
  from datalad.local.gitcredential import GitCredentialInterface
  from logging import getLogger
label_desc: Use image node_id 5 for calling the CompositeCredential obj's underlying member method code with example usage: obj.__call__() and returns: self