/// <summary>
        /// Sets any out and ref values, and return value, from the next expected call,
        /// assuming the <paramref name="fakeObjectCall"/> matches the next expected call.
        /// </summary>
        /// <param name="fakeObjectCall">The call made to the fake.</param>
        public void Apply(IInterceptedFakeObjectCall fakeObjectCall)
        {
            RecordedCall recordedCall = this.ConsumeNextExpectedCall(fakeObjectCall);

            SetReturnValue(fakeObjectCall, recordedCall);
            SetOutAndRefValues(fakeObjectCall, recordedCall);
        }
        private static void ApplyRecordedCall(RecordedCall recordedCall, IInterceptedFakeObjectCall fakeObjectCall)
        {
            fakeObjectCall.SetReturnValue(recordedCall.ReturnValue);

            int outAndRefIndex = 0;
            int parameterIndex = 0;

            foreach (var parameter in fakeObjectCall.Method.GetParameters())
            {
                if (parameter.ParameterType.IsByRef)
                {
                    fakeObjectCall.SetArgumentValue(parameterIndex, recordedCall.OutAndRefValues[outAndRefIndex++]);
                }

                ++parameterIndex;
            }
        }
        private static void SetOutAndRefValues(IInterceptedFakeObjectCall fakeObjectCall, RecordedCall recordedCall)
        {
            int outOrRefIndex = 0;

            for (int parameterIndex = 0; parameterIndex < fakeObjectCall.Method.GetParameters().Length; parameterIndex++)
            {
                var parameter = fakeObjectCall.Method.GetParameters()[parameterIndex];
                if (parameter.ParameterType.IsByRef)
                {
                    fakeObjectCall.SetArgumentValue(parameterIndex, recordedCall.OutAndRefValues[outOrRefIndex++]);
                }
            }
        }
 private static void SetReturnValue(IInterceptedFakeObjectCall fakeObjectCall, RecordedCall recordedCall)
 {
     fakeObjectCall.SetReturnValue(recordedCall.ReturnValue);
 }