code: def provides(arg_name=None, annotated_with=None, in_scope=None):
      
      if arg_name is None and annotated_with is None and in_scope is None:
          raise errors.EmptyProvidesDecoratorError(locations.get_back_frame_loc())
      return _get_pinject_wrapper(locations.get_back_frame_loc(),
                                  provider_arg_name=arg_name,
                                  provider_annotated_with=annotated_with,
                                  provider_in_scope_id=in_scope)
docs: Modifies the binding of a provider method.
  
      If arg_name is specified, then the created binding is for that arg name
      instead of the one gotten from the provider method name (e.g., 'foo' from
      'provide_foo').
  
      If annotated_with is specified, then the created binding includes that
      annotation object.
  
      If in_scope is specified, then the created binding is in the scope with
      that scope ID.
  
      At least one of the args must be specified.  A provider method may not be
      decorated with @provides() twice.
  
      Args:
        arg_name: the name of the arg to annotate on the decorated function
        annotated_with: an annotation object
        in_scope: a scope ID
      Returns:
        a function that will decorate functions passed to it