Index: Rhino.Mocks.Tests/OrderingExpectationTest.cs
===================================================================
--- Rhino.Mocks.Tests/OrderingExpectationTest.cs	(revision 0)
+++ Rhino.Mocks.Tests/OrderingExpectationTest.cs	(revision 0)
@@ -0,0 +1,93 @@
+﻿#if DOTNET35
+using MbUnit.Framework;
+using Rhino.Mocks.Exceptions;
+
+namespace Rhino.Mocks.Tests
+{
+    [TestFixture] public class OrderingExpectationTest
+    {
+        public interface IBefore  { void MethodBefore(); }
+
+        public interface IAfter { void MethodAfter(); }
+
+        private IBefore mockBefore;
+        private IAfter mockAfter;
+
+        [SetUp] public void SetUp()
+        {
+            mockBefore = MockRepository.GenerateStub<IBefore>();
+            mockAfter = MockRepository.GenerateStub<IAfter>();
+        }
+
+        [Test] public void Before_and_After_succeeds_if_all_beforeCalls_occurred_before_afterCalls()
+        {
+            AllBeforeThenAllAfter();
+
+            mockBefore.AssertWasCalled(b => b.MethodBefore())
+                .Before(mockAfter.AssertWasCalled(a => a.MethodAfter()));
+
+            mockAfter.AssertWasCalled(a => a.MethodAfter())
+                .After(mockBefore.AssertWasCalled(b => b.MethodBefore()));
+        }
+
+        [Test] public void Before_and_After_succeeds_if_before_occurred_before_after()
+        {
+            BeforeAfterInterlaced();
+
+            mockBefore.AssertWasCalled(b => b.MethodBefore()).First()
+                .Before(mockAfter.AssertWasCalled(a => a.MethodAfter()).First())
+                .Before(mockBefore.AssertWasCalled(b => b.MethodBefore()).Last());
+
+            mockAfter.AssertWasCalled(a => a.MethodAfter()).Last()
+                .After(mockBefore.AssertWasCalled(b => b.MethodBefore()).Last())
+                .After(mockAfter.AssertWasCalled(a=>a.MethodAfter()).First());
+        }
+
+        [Test] public void Before_and_After_chokes_if_one_of_beforeCalls_occurred_after_any_of_afterCalls()
+        {
+            BeforeAfterInterlaced();
+            Throws.Exception<ExpectationViolationException>(delegate{
+                mockBefore.AssertWasCalled(b => b.MethodBefore())
+                    .Before(mockAfter.AssertWasCalled(a => a.MethodAfter()));
+            });
+            Throws.Exception<ExpectationViolationException>(delegate
+            {
+                mockAfter.AssertWasCalled(a => a.MethodAfter())
+                    .After(mockBefore.AssertWasCalled(b => b.MethodBefore()));
+            });
+        }
+
+        [Test] public void Before_and_After_chokes_if_before_occurred_after_after()
+        {
+            BeforeAfterInterlaced();
+            Throws.Exception<ExpectationViolationException>(delegate{
+                mockBefore.AssertWasCalled(b => b.MethodBefore()).Last()
+                    .Before(mockAfter.AssertWasCalled(a => a.MethodAfter()).First());
+            });
+            Throws.Exception<ExpectationViolationException>(delegate
+            {
+                mockAfter.AssertWasCalled(a => a.MethodAfter()).First()
+                    .After(mockBefore.AssertWasCalled(b => b.MethodBefore()).Last());
+            });
+        }
+
+        private void AllBeforeThenAllAfter()
+        {
+            mockBefore.MethodBefore();
+            mockBefore.MethodBefore();
+            mockAfter.MethodAfter();
+            mockAfter.MethodAfter();
+            mockAfter.MethodAfter();
+        }
+
+        private void BeforeAfterInterlaced()
+        {
+            mockBefore.MethodBefore();
+            mockAfter.MethodAfter();
+            mockBefore.MethodBefore();
+            mockAfter.MethodAfter();
+            mockAfter.MethodAfter();
+        }
+    }
+}
+#endif
Index: Rhino.Mocks.Tests/PartialMockTests.cs
===================================================================
--- Rhino.Mocks.Tests/PartialMockTests.cs	(revision 2212)
+++ Rhino.Mocks.Tests/PartialMockTests.cs	(working copy)
@@ -28,6 +28,7 @@
 
 
 using System;
+using System.Collections.Generic;
 using System.Text;
 using System.Windows.Forms;
 using MbUnit.Framework;
@@ -105,6 +106,38 @@
     		Assert.AreEqual(4, withParameters.Int);
     		mocks.VerifyAll();
     	}
+
+        [Test]
+        public void CanMockGenericMethodWithListArrayArgument()
+        {
+            var mock = mocks.PartialMock<ComplexClass>();
+            mocks.ReplayAll();
+            mock.GenericMethodWithListArrayArgument<string>(null);
+        }
+
+        [Test]
+        public void CanMockGenericMethodWithGenericOfGenericArgument()
+        {
+            var mock = mocks.PartialMock<ComplexClass>();
+            mocks.ReplayAll();
+            mock.GenericMethodWithGenericOfGenericArgument<string>(null);
+        }
+
+        [Test]
+        public void CanMockGenericMethodReturnsListArray()
+        {
+            var mock = mocks.PartialMock<ComplexClass>();
+            mocks.ReplayAll();
+            mock.GenericMethodReturnsListArray<string>();
+        }
+
+        [Test]
+        public void CanMockGenericMethodReturnsGenericOfGenericType()
+        {
+            var mock = mocks.PartialMock<ComplexClass>();
+            mocks.ReplayAll();
+            mock.GenericMethodReturnsGenericOfGenericType<string>();
+        }
     }
     
     public abstract class AbstractClass
@@ -141,4 +174,15 @@
 			set { i = value; }
 		}
 	}
+
+    public abstract class ComplexClass
+    {
+        public virtual void GenericMethodWithListArrayArgument<T>(List<T>[] action) { }
+        public virtual void GenericMethodWithGenericOfGenericArgument<T>(IEnumerable<IComparer<T>> compararers) { }
+        public virtual List<T>[] GenericMethodReturnsListArray<T>() { return null; }
+        public virtual IEnumerable<IComparer<T>> GenericMethodReturnsGenericOfGenericType<T>() { return null; }
+
+        /* ... */
+    }
+
 }
Index: Rhino.Mocks.Tests/Rhino.Mocks.Tests 3.5.csproj
===================================================================
--- Rhino.Mocks.Tests/Rhino.Mocks.Tests 3.5.csproj	(revision 2212)
+++ Rhino.Mocks.Tests/Rhino.Mocks.Tests 3.5.csproj	(working copy)
@@ -117,6 +117,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="BackToRecord.cs" />
+    <Compile Include="OrderingExpectationTest.cs" />
     <Compile Include="Callbacks\CallbackTests.cs">
       <SubType>Code</SubType>
     </Compile>
Index: Rhino.Mocks/CallRecord.cs
===================================================================
--- Rhino.Mocks/CallRecord.cs	(revision 0)
+++ Rhino.Mocks/CallRecord.cs	(revision 0)
@@ -0,0 +1,22 @@
+using System.Reflection;
+using System.Threading;
+using Rhino.Mocks.Interfaces;
+
+namespace Rhino.Mocks
+{
+    /// <summary>
+    /// Record about information of a specific method invokation
+    /// </summary>
+    public class CallRecord
+    {
+        private static long sequencer = long.MinValue;
+
+        internal CallRecord()
+        {
+            Sequence = Interlocked.Increment(ref sequencer);
+        }
+        internal object[] Arguments { get; set; }
+        internal long Sequence { get; private set; }
+        internal MethodInfo Method { get; set; }
+    }
+}
\ No newline at end of file
Index: Rhino.Mocks/ExpectationVerificationInformation.cs
===================================================================
--- Rhino.Mocks/ExpectationVerificationInformation.cs	(revision 2212)
+++ Rhino.Mocks/ExpectationVerificationInformation.cs	(working copy)
@@ -10,6 +10,23 @@
 		private IList<object[]> argumentsForAllCalls;
 		
 		public IExpectation Expected { get { return expected; } set { expected = value; } }
-		public IList<object[]> ArgumentsForAllCalls { get { return argumentsForAllCalls; } set { argumentsForAllCalls = value; }  }
+        public ICollection<CallRecord> AllCallRecords { get; set; }
+        public IList<object[]> ArgumentsForAllCalls
+	    {
+	        get
+	        {
+                if (argumentsForAllCalls==null)
+                {
+                    var allCalls = AllCallRecords;
+                    var a = new List<object[]>(allCalls.Count);
+                    foreach (var call in allCalls)
+                    {
+                        a.Add(call.Arguments);
+                    }
+                    argumentsForAllCalls = a;
+                }
+	            return argumentsForAllCalls;
+	        }
+	    }
 	}
 }
Index: Rhino.Mocks/Impl/ProxyInstance.cs
===================================================================
--- Rhino.Mocks/Impl/ProxyInstance.cs	(revision 2212)
+++ Rhino.Mocks/Impl/ProxyInstance.cs	(working copy)
@@ -51,7 +51,7 @@
 		private IDictionary eventsSubscribers;
 		private readonly Type[] implemented;
 
-	    private readonly IDictionary<MethodInfo, ICollection<object[]>> methodToActualCalls = new Dictionary<MethodInfo, ICollection<object[]>>();
+	    private readonly IDictionary<MethodInfo, ICollection<CallRecord>> methodToActualCalls = new Dictionary<MethodInfo, ICollection<CallRecord>>();
 	    private object[] constructorArguments = new object[0];
 	    private IList<IMockedObject> dependentMocks = new List<IMockedObject>();
 
@@ -284,10 +284,10 @@
 		/// <remarks>
 		/// Only method calls in replay mode are counted
 		/// </remarks>
-	    public ICollection<object[]> GetCallArgumentsFor(MethodInfo method)
+	    public ICollection<CallRecord> GetCallArgumentsFor(MethodInfo method)
 	    {
             if (methodToActualCalls.ContainsKey(method) == false)
-                return new List<object[]>();
+                return new List<CallRecord>();
 	        return methodToActualCalls[method];
 	    }
 
@@ -302,8 +302,11 @@
 	        if(repository.IsInReplayMode(this)==false)
 	            return;
             if (methodToActualCalls.ContainsKey(method) == false)
-                methodToActualCalls[method] = new List<object[]>();
-	        methodToActualCalls[method].Add(args);
+                methodToActualCalls[method] = new List<CallRecord>();
+	        methodToActualCalls[method].Add(new CallRecord{
+                Arguments = args,
+                Method = method,
+            });
         }
 
 	    /// <summary>
Index: Rhino.Mocks/Interfaces/IMockedObject.cs
===================================================================
--- Rhino.Mocks/Interfaces/IMockedObject.cs	(revision 2212)
+++ Rhino.Mocks/Interfaces/IMockedObject.cs	(working copy)
@@ -128,7 +128,7 @@
         /// <remarks>
         /// Only method calls in replay mode are counted
         /// </remarks>
-	    ICollection<object[]> GetCallArgumentsFor(MethodInfo method);
+        ICollection<CallRecord> GetCallArgumentsFor(MethodInfo method);
 
         /// <summary>
         /// Records the method call
Index: Rhino.Mocks/Rhino.Mocks 2.0.csproj
===================================================================
--- Rhino.Mocks/Rhino.Mocks 2.0.csproj	(revision 2212)
+++ Rhino.Mocks/Rhino.Mocks 2.0.csproj	(working copy)
@@ -74,6 +74,7 @@
     <Compile Include="Arg.cs" />
     <Compile Include="ArgManager.cs" />
     <Compile Include="BackToRecordOptions.cs" />
+    <Compile Include="CallRecord.cs" />
     <Compile Include="Constraints\AbstractConstraint.cs">
       <SubType>Code</SubType>
     </Compile>
@@ -139,6 +140,7 @@
     <Compile Include="Interfaces\IExpectationLogger.cs" />
     <Compile Include="Interfaces\IPartialMockMarker.cs" />
     <Compile Include="Interfaces\OriginalCallOptions.cs" />
+    <Compile Include="MethodInvocation.cs" />
     <Compile Include="MockRepositoryRecordPlayback.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Utilities\GenericsUtil.cs" />
@@ -255,6 +257,7 @@
       <SubType>Code</SubType>
     </Compile>
     <Compile Include="With.cs" />
+    <Compile Include="__ProtectAttribute.cs" />
     <None Include="..\..\ayende-open-source.snk">
       <Link>ayende-open-source.snk</Link>
     </None>
@@ -264,4 +267,4 @@
     <Service Include="{B4F97281-0DBD-4835-9ED8-7DFB966E87FF}" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-</Project>
+</Project>
\ No newline at end of file
Index: Rhino.Mocks/Rhino.Mocks 3.5.csproj
===================================================================
--- Rhino.Mocks/Rhino.Mocks 3.5.csproj	(revision 2212)
+++ Rhino.Mocks/Rhino.Mocks 3.5.csproj	(working copy)
@@ -22,13 +22,15 @@
     <UpgradeBackupLocation>
     </UpgradeBackupLocation>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <TargetFrameworkSubset>
+    </TargetFrameworkSubset>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <OutputPath>bin\debug\</OutputPath>
     <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
     <BaseAddress>285212672</BaseAddress>
     <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <DefineConstants>TRACE;DEBUG;DOTNET35</DefineConstants>
+    <DefineConstants>TRACE;DEBUG;DOTNET35, FOR_NET_2_0</DefineConstants>
     <DocumentationFile>bin\debug\Rhino.Mocks.XML</DocumentationFile>
     <DebugSymbols>true</DebugSymbols>
     <FileAlignment>4096</FileAlignment>
@@ -52,7 +54,7 @@
     <Optimize>true</Optimize>
     <RegisterForComInterop>false</RegisterForComInterop>
     <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
     <WarningLevel>4</WarningLevel>
     <DebugType>pdbonly</DebugType>
     <DocumentationFile>Rhino.Mocks.XML</DocumentationFile>
@@ -77,6 +79,7 @@
     <Compile Include="Arg.cs" />
     <Compile Include="ArgManager.cs" />
     <Compile Include="BackToRecordOptions.cs" />
+    <Compile Include="CallRecord.cs" />
     <Compile Include="Constraints\AbstractConstraint.cs">
       <SubType>Code</SubType>
     </Compile>
@@ -266,6 +269,7 @@
     </None>
     <Compile Include="CompatabilityWith2.0.cs" />
     <Compile Include="__ProtectAttribute.cs" />
+    <None Include="app.config" />
     <None Include="Diagram.cd" />
   </ItemGroup>
   <ItemGroup>
Index: Rhino.Mocks/RhinoMocksExtensions.cs
===================================================================
--- Rhino.Mocks/RhinoMocksExtensions.cs	(revision 2212)
+++ Rhino.Mocks/RhinoMocksExtensions.cs	(working copy)
@@ -213,9 +213,13 @@
 		/// <typeparam name="T"></typeparam>
 		/// <param name="mock">The mock.</param>
 		/// <param name="action">The action.</param>
-		public static void AssertWasCalled<T>(this T mock, Action<T> action)
+		/// <returns>
+        /// One or more <see cref="CallRecord"/>s for all the calls that have 
+        /// been made in the order of the time the calls are made.
+        /// </returns>
+        public static IList<CallRecord> AssertWasCalled<T>(this T mock, Action<T> action)
 		{
-			AssertWasCalled(mock, action, DefaultConstraintSetup);
+			return AssertWasCalled(mock, action, DefaultConstraintSetup);
 		}
 
 		private static void DefaultConstraintSetup(IMethodOptions<object> options)
@@ -230,19 +234,24 @@
 		/// <param name="mock">The mock.</param>
 		/// <param name="action">The action.</param>
 		/// <param name="setupConstraints">The setup constraints.</param>
-		public static void AssertWasCalled<T>(this T mock, Action<T> action, Action<IMethodOptions<object>> setupConstraints)
+        /// <returns>
+        /// One or more <see cref="CallRecord"/>(s) for all the matched calls 
+        /// in the order of time the calles are made.
+        /// </returns>
+        public static IList<CallRecord> AssertWasCalled<T>(this T mock, Action<T> action, Action<IMethodOptions<object>> setupConstraints)
 		{
 			ExpectationVerificationInformation verificationInformation = GetExpectationsToVerify(mock, action, setupConstraints);
-
-			foreach (var args in verificationInformation.ArgumentsForAllCalls)
+            List<CallRecord> records = new List<CallRecord>();
+			foreach (var record in verificationInformation.AllCallRecords)
 			{
-				if (verificationInformation.Expected.IsExpected(args))
+				if (verificationInformation.Expected.IsExpected(record.Arguments))
 				{
 					verificationInformation.Expected.AddActualCall();
+                    records.Add(record);
 				}
 			}
 			if (verificationInformation.Expected.ExpectationSatisfied)
-				return;
+				return records;
 			throw new ExpectationViolationException(verificationInformation.Expected.BuildVerificationFailureMessage());
         }
 
@@ -253,10 +262,14 @@
         /// <typeparam name="T"></typeparam>
         /// <param name="mock">The mock.</param>
         /// <param name="action">The action.</param>
-        public static void AssertWasCalled<T>(this T mock, Func<T, object> action)
+        /// <returns>
+        /// One or more <see cref="CallRecord"/>s for all the calls that have 
+        /// been made in the order of the time the calls are made.
+        /// </returns>
+        public static IList<CallRecord> AssertWasCalled<T>(this T mock, Function<T, object> action)
         {
             var newAction = new Action<T>(t => action(t));
-            AssertWasCalled(mock, newAction, DefaultConstraintSetup);
+            return AssertWasCalled(mock, newAction, DefaultConstraintSetup);
         }
 
         /// <summary>
@@ -267,14 +280,17 @@
         /// <param name="mock">The mock.</param>
         /// <param name="action">The action.</param>
         /// <param name="setupConstraints">The setup constraints.</param>
-        public static void AssertWasCalled<T>(this T mock, Func<T, object> action, Action<IMethodOptions<object>> setupConstraints)
+        /// <returns>
+        /// One or more <see cref="CallRecord"/>(s) for all the matched calls 
+        /// in the order of time the calles are made.
+        /// </returns>
+        public static IList<CallRecord> AssertWasCalled<T>(this T mock, Function<T, object> action, Action<IMethodOptions<object>> setupConstraints)
         {
             var newAction = new Action<T>(t => action(t));
-            AssertWasCalled(mock, newAction, setupConstraints);
+            return AssertWasCalled(mock, newAction, setupConstraints);
         }
 
-
-		/// <summary>
+        /// <summary>
 		/// Asserts that a particular method was NOT called on this mock object
 		/// </summary>
 		/// <typeparam name="T"></typeparam>
@@ -312,7 +328,7 @@
         /// <typeparam name="T"></typeparam>
         /// <param name="mock">The mock.</param>
         /// <param name="action">The action.</param>
-        public static void AssertWasNotCalled<T>(this T mock, Func<T, object> action)
+        public static void AssertWasNotCalled<T>(this T mock, Function<T, object> action)
         {
             var newAction = new Action<T>(t => action(t));
             AssertWasNotCalled(mock, newAction, DefaultConstraintSetup);
@@ -325,7 +341,7 @@
         /// <param name="mock">The mock.</param>
         /// <param name="action">The action.</param>
         /// <param name="setupConstraints">The setup constraints.</param>
-        public static void AssertWasNotCalled<T>(this T mock, Func<T, object> action, Action<IMethodOptions<object>> setupConstraints)
+        public static void AssertWasNotCalled<T>(this T mock, Function<T, object> action, Action<IMethodOptions<object>> setupConstraints)
         {
             var newAction = new Action<T>(t => action(t));
             AssertWasNotCalled(mock, newAction, setupConstraints);
@@ -361,10 +377,10 @@
 				throw new InvalidOperationException(
 					"The expectation was removed from the waiting expectations list, did you call Repeat.Any() ? This is not supported in AssertWasCalled()");
 			IExpectation expected = expectationsToVerify[0];
-			ICollection<object[]> argumentsForAllCalls = mockedObject.GetCallArgumentsFor(expected.Method);
+			ICollection<CallRecord> argumentsForAllCalls = mockedObject.GetCallArgumentsFor(expected.Method);
 			return new ExpectationVerificationInformation
 					{
-						ArgumentsForAllCalls = new List<object[]>(argumentsForAllCalls),
+						AllCallRecords = new List<CallRecord>(argumentsForAllCalls),
 						Expected = expected
 					};
         }
@@ -449,6 +465,106 @@
 			eventRaiser.Raise(args);
 		}
 
+        /// <summary>
+        /// Assert that all calls specified by <paramref name="beforeCalls"/> 
+        /// occurred before all calls specified by <paramref name="afterCalls"/>
+        /// </summary>
+        /// <param name="beforeCalls">
+        /// Calls that happens before <paramref name="afterCalls"/>
+        /// </param>
+        /// <param name="afterCalls">
+        /// Calls that happens after <paramref name="beforeCalls"/>
+        /// </param>
+        public static IList<CallRecord> Before(this IList<CallRecord> beforeCalls, IList<CallRecord> afterCalls)
+        {
+            Ordered(Last(beforeCalls), First(afterCalls));
+            return afterCalls;
+        }
+
+        /// <summary>
+        /// Assert that all calls specified by <paramref name="afterCalls"/> 
+        /// occurred after all calls specified by <paramref name="beforeCalls"/>
+        /// </summary>
+        /// <param name="afterCalls">
+        /// Calls that happens after <paramref name="beforeCalls"/>
+        /// </param>
+        /// <param name="beforeCalls">
+        /// Calls that happens before <paramref name="afterCalls"/>
+        /// </param>
+        public static IList<CallRecord> After(this IList<CallRecord> afterCalls, IList<CallRecord> beforeCalls)
+        {
+            Ordered(Last(beforeCalls), First(afterCalls));
+            return beforeCalls;
+        }
+
+        /// <summary>
+        /// Assert that the call specified by <paramref name="before"/> 
+        /// occurred before the call specified by <paramref name="after"/>
+        /// </summary>
+        /// <param name="before">
+        /// Call that occurred before <paramref name="after"/>
+        /// </param>
+        /// <param name="after">
+        /// Call that occurred after <paramref name="before"/>
+        /// </param>
+        public static CallRecord Before(this CallRecord before, CallRecord after)
+        {
+            Ordered(before, after);
+            return after;
+        }
+
+        /// <summary>
+        /// Assert that the call specified by <paramref name="after"/> 
+        /// occurred after the call specified by <paramref name="before"/>
+        /// </summary>
+        /// <param name="after">
+        /// Call that occurred after <paramref name="before"/>
+        /// </param>
+        /// <param name="before">
+        /// Call that occurred before <paramref name="after"/>
+        /// </param>
+        public static CallRecord After(this CallRecord after, CallRecord before)
+        {
+            Ordered(before, after);
+            return before;
+        }
+
+        /// <summary>
+        /// Returns the last executed call in the <paramref name="callRecords"/>.
+        /// </summary>
+        /// <param name="callRecords">
+        /// A list of call records ordered by the time they were executed.
+        /// </param>
+        /// <returns>The last call executed in <paramref name="callRecords"/></returns>
+        public static CallRecord Last(this IList<CallRecord> callRecords)
+        {
+            return callRecords[callRecords.Count - 1];
+        }
+
+        /// <summary>
+        /// Returns the first executed call in the <paramref name="callRecords"/>.
+        /// </summary>
+        /// <param name="callRecords">
+        /// A list of call records ordered by the time they were executed.
+        /// </param>
+        /// <returns>The first call executed in <paramref name="callRecords"/></returns>
+        public static CallRecord First(this IList<CallRecord> callRecords)
+        {
+            return callRecords[0];
+        }
+
+	    private static void Ordered(CallRecord before, CallRecord after)
+	    {
+	        if (before.Sequence > after.Sequence)
+	        {
+	            throw new ExpectationViolationException(
+	                "Expected that call " + before.Method +
+	                " occurs before call " + after.Method +
+	                ", but the expectation is not satisfied.");
+
+	        }
+	    }
+
 		private static void AssertExactlySingleExpectaton<T>(MockRepository mocks, T mockToRecordExpectation)
 		{
 			if (mocks.Replayer.GetAllExpectationsForProxy(mockToRecordExpectation).Count == 0)
