/// <summary>
        /// Handles the method
        /// </summary>
        /// <param name="method"></param>
        /// <param name="arguments"></param>
        public override void HandleMethodCall(MethodInfo method, object[] arguments)
        {
            Method = method;

            if (ArgumentManager.HasBeenUsed)
            {
                ArgumentManager.ValidateMethodSignature(method);
                Arguments       = ArgumentManager.GetConstraints();
                ReturnArguments = ArgumentManager.GetReturnValues();
                SetExpectedCount(new Range(1, null));
                ArgumentManager.Clear();

                return;
            }

            var parameters  = method.GetParameters();
            var constraints = new AbstractConstraint[parameters.Length];

            for (int index = 0; index < parameters.Length; index++)
            {
                var parameter = parameters[index];
                constraints[index] = (parameter.IsOut)
                    ? Is.Anything()
                    : Is.Equal(arguments[index]);
            }

            Arguments = constraints;
        }
        /// <summary>
        /// Handles the call
        /// </summary>
        /// <param name="method"></param>
        /// <param name="arguments"></param>
        public override void HandleMethodCall(MethodInfo method, object[] arguments)
        {
            if (!method.IsSpecialName)
            {
                throw new InvalidOperationException("Property expectations can only be set for properties.");
            }

            var methodName = method.Name;

            if (!methodName.StartsWith("get_") && !methodName.StartsWith("set_"))
            {
                throw new InvalidOperationException("Property expectations can only be set for properties.");
            }

            var propertyName = method.Name.Substring(4);

            PropertyInfo property;

            if (methodName.StartsWith("get_"))
            {
                var types = new Type[arguments.Length];
                if (arguments.Length > 0)
                {
                    for (int argumentIndex = 0; argumentIndex < arguments.Length; argumentIndex++)
                    {
                        types[argumentIndex] = arguments[argumentIndex].GetType();
                    }
                }

                property = method.DeclaringType.GetProperty(propertyName, types);
            }
            else
            {
                var argumentLength = (arguments.Length - 1);
                var types          = new Type[argumentLength];
                if (argumentLength > 0)
                {
                    for (int argumentIndex = 0; argumentIndex < argumentLength; argumentIndex++)
                    {
                        types[argumentIndex] = arguments[argumentIndex].GetType();
                    }
                }

                property = method.DeclaringType.GetProperty(propertyName, types);
            }

            MethodGet = property.GetGetMethod(true);
            MethodSet = property.GetSetMethod(true);

            if (MethodGet == null || MethodSet == null)
            {
                throw new InvalidOperationException("Property must be read/write.");
            }

            if (ArgumentManager.HasBeenUsed)
            {
                ArgumentManager.ValidateMethodSignature(method);
                Arguments       = ArgumentManager.GetConstraints();
                ReturnArguments = ArgumentManager.GetReturnValues();
                SetExpectedCount(new Range(1, null));
                ArgumentManager.Clear();

                return;
            }

            var parameters  = method.GetParameters();
            var constraints = new AbstractConstraint[parameters.Length];

            for (int index = 0; index < parameters.Length; index++)
            {
                var parameter = parameters[index];
                constraints[index] = (parameter.IsOut)
                    ? Is.Anything()
                    : Is.Equal(arguments[index]);
            }

            Arguments = constraints;
        }