docs: def inject(function):
      """Decorator declaring parameters to be injected.
  
      eg.
  
      >>> Sizes = Key('sizes')
      >>> Names = Key('names')
      >>>
      >>> class A:
      ...     @inject
      ...     def __init__(self, number: int, name: str, sizes: Sizes):
      ...         print([number, name, sizes])
      ...
      >>> def configure(binder):
      ...     binder.bind(A)
      ...     binder.bind(int, to=123)
      ...     binder.bind(str, to='Bob')
      ...     binder.bind(Sizes, to=[1, 2, 3])
  
      Use the Injector to get a new instance of A:
  
      >>> a = Injector(configure).get(A)
      [123, 'Bob', [1, 2, 3]]
  
      .. note::
  
          This decorator is to be used on class constructors. Using it on non-constructor
          methods worked in the past but it was an implementation detail rather than
          a design decision.
  
          Third party libraries may, however, provide support for injecting dependencies
          into non-constructor methods or free functions in one form or another.
      """
      try:
          bindings = _infer_injected_bindings(function)
      except _BindingNotYetAvailable:
          bindings = 'deferred'
      return method_wrapper(function, bindings)