docs: def _name_value_to_bson(name, value, check_keys, opts):
      """Encode a single name, value pair."""
  
      # First see if the type is already cached. KeyError will only ever
      # happen once per subtype.
      try:
          return _ENCODERS[type(value)](name, value, check_keys, opts)
      except KeyError:
          pass
  
      # Second, fall back to trying _type_marker. This has to be done
      # before the loop below since users could subclass one of our
      # custom types that subclasses a python built-in (e.g. Binary)
      marker = getattr(value, "_type_marker", None)
      if isinstance(marker, int) and marker in _MARKERS:
          func = _MARKERS[marker]
          # Cache this type for faster subsequent lookup.
          _ENCODERS[type(value)] = func
          return func(name, value, check_keys, opts)
  
      # If all else fails test each base type. This will only happen once for
      # a subtype of a supported base type.
      for base in _ENCODERS:
          if isinstance(value, base):
              func = _ENCODERS[base]
              # Cache this type for faster subsequent lookup.
              _ENCODERS[type(value)] = func
              return func(name, value, check_keys, opts)
  
      raise InvalidDocument("cannot convert value of type %s to bson" %
                            type(value))