code: func (c *Call) DoAndReturn(f interface{}) *Call {
  	// TODO: Check arity and types here, rather than dying badly elsewhere.
  	v := reflect.ValueOf(f)
  
  	c.addAction(func(args []interface{}) []interface{} {
  		vargs := make([]reflect.Value, len(args))
  		ft := v.Type()
  		for i := 0; i < len(args); i++ {
  			if args[i] != nil {
  				vargs[i] = reflect.ValueOf(args[i])
  			} else {
  				// Use the zero value for the arg.
  				vargs[i] = reflect.Zero(ft.In(i))
  			}
  		}
  		vrets := v.Call(vargs)
  		rets := make([]interface{}, len(vrets))
  		for i, ret := range vrets {
  			rets[i] = ret.Interface()
  		}
  		return rets
  	})
  	return c
  }
docs: // DoAndReturn declares the action to run when the call is matched.
  // The return values from this function are returned by the mocked function.
  // It takes an interface{} argument to support n-arity functions.