/// <summary>
        /// Gets the all expectations for proxy.
        /// </summary>
        /// <param name="proxy">Mocked object.</param>
        /// <returns>List of all relevant expectation</returns>
        protected override ExpectationsList DoGetAllExpectationsForProxy(object proxy)
        {
            Validate.IsNotNull(proxy, "proxy");

            ExpectationsList expectations = new ExpectationsList();

            foreach (object action in recordedActions)
            {
                ProxyMethodExpectationTriplet triplet = action as ProxyMethodExpectationTriplet;
                if (triplet != null)
                {
                    if (MockedObjectsEquality.Instance.Equals(triplet.Proxy, proxy))
                    {
                        expectations.Add(triplet.Expectation);
                    }
                }
                else                 //Action is another recorder
                {
                    IMethodRecorder  innerRecorder        = (IMethodRecorder)action;
                    ExpectationsList expectationsForProxy = innerRecorder.GetAllExpectationsForProxy(proxy);
                    expectations.AddRange(expectationsForProxy);
                }
            }
            return(expectations);
        }
        /// <summary>
        /// Gets the all expectations for a mocked object and method combination,
        /// regardless of the expected arguments / callbacks / contraints.
        /// </summary>
        /// <param name="proxy">Mocked object.</param>
        /// <param name="method">Method.</param>
        /// <returns>List of all relevant expectation</returns>
        public override ExpectationsList GetAllExpectationsForProxyAndMethod(object proxy, MethodInfo method)
        {
            Validate.IsNotNull(proxy, "proxy");
            Validate.IsNotNull(method, "method");

            ExpectationsList expectations = new ExpectationsList();

            foreach (object action in recordedActions)
            {
                ProxyMethodExpectationTriplet triplet = action as ProxyMethodExpectationTriplet;
                if (triplet != null)
                {
                    if (MockedObjectsEquality.Instance.Equals(triplet.Proxy, proxy) &&
                        MethodsEquals(method, triplet))
                    {
                        expectations.Add(triplet.Expectation);
                    }
                }
                else                 //Action is another recorder
                {
                    IMethodRecorder innerRecorder = (IMethodRecorder)action;
                    expectations.AddRange(innerRecorder.GetAllExpectationsForProxyAndMethod(proxy, method));
                }
            }
            return(expectations);
        }
        /// <summary>
        /// Set the expectation so it can repeat any number of times.
        /// </summary>
        public void AddToRepeatableMethods(object proxy, MethodInfo method, IExpectation expectation)
        {
            //Just to get an error if I make a mistake and try to add a normal
            //method to the speical repeat method
            Debug.Assert(expectation.RepeatableOption != RepeatableOption.Normal);
            RemoveExpectation(expectation);
            ProxyMethodPair pair = new ProxyMethodPair(proxy, method);

            if (repeatableMethods.ContainsKey(pair) == false)
            {
                repeatableMethods.Add(pair, new ExpectationsList());
            }
            ExpectationsList expectationsList = repeatableMethods[pair];

            ExpectationNotOnList(expectationsList, expectation,
                                 MockRepository.IsStub(proxy));
            expectationsList.Add(expectation);
        }
        /// <summary>
        /// Gets the all expectations for proxy.
        /// </summary>
        /// <param name="proxy">Mocked object.</param>
        /// <returns>List of all relevant expectation</returns>
        protected override ExpectationsList DoGetAllExpectationsForProxy(object proxy)
        {
            Validate.IsNotNull(proxy, "proxy");

            ExpectationsList expectations = new ExpectationsList();
            foreach (object action in recordedActions)
            {
                ProxyMethodExpectationTriplet triplet = action as ProxyMethodExpectationTriplet;
                if (triplet != null)
                {
                    if (MockedObjectsEquality.Instance.Equals( triplet.Proxy , proxy))
                    {
                        expectations.Add(triplet.Expectation);
                    }
                }
                else //Action is another recorder
                {
                    IMethodRecorder innerRecorder = (IMethodRecorder) action;
                    ExpectationsList expectationsForProxy = innerRecorder.GetAllExpectationsForProxy(proxy);
                    expectations.AddRange(expectationsForProxy);
                }
            }
            return expectations;
        }
        /// <summary>
        /// Gets the all expectations for a mocked object and method combination,
        /// regardless of the expected arguments / callbacks / contraints.
        /// </summary>
        /// <param name="proxy">Mocked object.</param>
        /// <param name="method">Method.</param>
        /// <returns>List of all relevant expectation</returns>
        public override ExpectationsList GetAllExpectationsForProxyAndMethod(object proxy, MethodInfo method)
        {
            Validate.IsNotNull(proxy, "proxy");
            Validate.IsNotNull(method, "method");

            ExpectationsList expectations = new ExpectationsList();
            foreach (object action in recordedActions)
            {
                ProxyMethodExpectationTriplet triplet = action as ProxyMethodExpectationTriplet;
                if (triplet != null)
                {
                    if (MockedObjectsEquality.Instance.Equals( triplet.Proxy , proxy ) &&
                        MethodsEquals(method, triplet))
                    {
                        expectations.Add(triplet.Expectation);
                    }
                }
                else //Action is another recorder
                {
                    IMethodRecorder innerRecorder = (IMethodRecorder) action;
                    expectations.AddRange(innerRecorder.GetAllExpectationsForProxyAndMethod(proxy, method));
                }
            }
            return expectations;
        }