/// <summary>
        /// Evaluates the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        public decimal Evaluate(IToken[] args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            else if (args.Length != this._argumentCount)
            {
                throw new ArgumentException(string.Format("The number of arguments should equal {0}.", this._argumentCount), "args");
            }

            decimal[] numbers = args.ConvertToDecimalArray();

            decimal result = 0.0M;
            switch(this._operatorType)
            {
                case OperatorType.Add:
                    result = Add(numbers);
                    break;

                case OperatorType.Divide:
                    result = Divide(numbers);
                    break;

                case OperatorType.Modulo:
                    result = Modulo(numbers);
                    break;

                case OperatorType.Multiply:
                    result = Multiply(numbers);
                    break;

                case OperatorType.RaiseTo:
                    result = RaiseTo(numbers);
                    break;

                case OperatorType.Subtract:
                    result = Subtract(numbers);
                    break;

                case OperatorType.UnaryMinus:
                    result = UnaryMinus(numbers);
                    break;

                default:
                    throw new InvalidOperationException(string.Format("Unsupported operator type '{0}'.", this._operatorType));
            }

            return result;
        }