docs: def register_adapter(from_classes, to_classes, func):
      """
      Register a function that can handle adapting from `from_classes` to `to_classes`.
      """
      assert from_classes, 'Must supply classes to adapt from'
      assert to_classes, 'Must supply classes to adapt to'
      assert func, 'Must supply adapter function'
  
      if not isinstance(from_classes, (tuple, list)):
          from_classes = [from_classes]
      if not isinstance(to_classes, (tuple, list)):
          to_classes = [to_classes]
  
      for key in itertools.product(from_classes, to_classes):
          if key in __adapters__:
              raise AdapterExists('%r to %r already exists.' % key)
          __adapters__[key] = func