code: func (ctrl *Controller) Call(receiver interface{}, method string, args ...interface{}) []interface{} {
  	ctrl.T.Helper()
  
  	// Nest this code so we can use defer to make sure the lock is released.
  	actions := func() []func([]interface{}) []interface{} {
  		ctrl.T.Helper()
  		ctrl.mu.Lock()
  		defer ctrl.mu.Unlock()
  
  		expected, err := ctrl.expectedCalls.FindMatch(receiver, method, args)
  		if err != nil {
  			origin := callerInfo(2)
  			ctrl.T.Fatalf("Unexpected call to %T.%v(%v) at %s because: %s", receiver, method, args, origin, err)
  		}
  
  		// Two things happen here:
  		// * the matching call no longer needs to check prerequite calls,
  		// * and the prerequite calls are no longer expected, so remove them.
  		preReqCalls := expected.dropPrereqs()
  		for _, preReqCall := range preReqCalls {
  			ctrl.expectedCalls.Remove(preReqCall)
  		}
  
  		actions := expected.call(args)
  		if expected.exhausted() {
  			ctrl.expectedCalls.Remove(expected)
  		}
  		return actions
  	}()
  
  	var rets []interface{}
  	for _, action := range actions {
  		if r := action(args); r != nil {
  			rets = r
  		}
  	}
  
  	return rets
  }
docs: // Call is called by a mock. It should not be called by user code.