code: func (p provider) Provide(g Graph) reflect.Value {
  	fnType := reflect.TypeOf(p.constructor)
  
  	argCount := fnType.NumIn()
  	if fnType.IsVariadic() {
  		argCount = len(p.argPtrs)
  	}
  
  	args := make([]reflect.Value, argCount, argCount)
  	var inType reflect.Type
  	for i := 0; i < argCount; i++ {
  		arg := g.Resolve(p.argPtrs[i])
  		argType := arg.Type()
  
  		if i < fnType.NumIn() {
  			inType = fnType.In(i)
  		} else {
  			inType = fnType.In(fnType.NumIn() - 1)
  		}
  
  		if inType.Kind() == reflect.Slice {
  			inType = inType.Elem()
  		}
  
  		if !argType.AssignableTo(inType) {
  			if !argType.ConvertibleTo(inType) {
  				panic(fmt.Sprintf(
  					"arg %d of type %q cannot be assigned or converted to type %q for provider constructor (%s)",
  					i, argType, inType, p.constructor,
  				))
  			}
  			arg = arg.Convert(inType)
  		}
  		args[i] = arg
  	}
  
  	return reflect.ValueOf(p.constructor).Call(args)[0]
  }
docs: // Provide returns the result of executing the constructor with argument values resolved from a dependency graph