code: func (c *Call) SetArg(n int, value interface{}) *Call {
  	c.t.Helper()
  
  	mt := c.methodType
  	// TODO: This will break on variadic methods.
  	// We will need to check those at invocation time.
  	if n < 0 || n >= mt.NumIn() {
  		c.t.Fatalf("SetArg(%d, ...) called for a method with %d args [%s]",
  			n, mt.NumIn(), c.origin)
  	}
  	// Permit setting argument through an interface.
  	// In the interface case, we don't (nay, can't) check the type here.
  	at := mt.In(n)
  	switch at.Kind() {
  	case reflect.Ptr:
  		dt := at.Elem()
  		if vt := reflect.TypeOf(value); !vt.AssignableTo(dt) {
  			c.t.Fatalf("SetArg(%d, ...) argument is a %v, not assignable to %v [%s]",
  				n, vt, dt, c.origin)
  		}
  	case reflect.Interface:
  		// nothing to do
  	case reflect.Slice:
  		// nothing to do
  	default:
  		c.t.Fatalf("SetArg(%d, ...) referring to argument of non-pointer non-interface non-slice type %v [%s]",
  			n, at, c.origin)
  	}
  
  	c.addAction(func(args []interface{}) []interface{} {
  		v := reflect.ValueOf(value)
  		switch reflect.TypeOf(args[n]).Kind() {
  		case reflect.Slice:
  			setSlice(args[n], v)
  		default:
  			reflect.ValueOf(args[n]).Elem().Set(v)
  		}
  		return nil
  	})
  	return c
  }
docs: // SetArg declares an action that will set the nth argument's value,
  // indirected through a pointer. Or, in the case of a slice, SetArg
  // will copy value's elements into the nth argument.