public object CallFunction(string functionName, params object[] args)
        {
            string serializedArguments = string.Empty;
            int    argumentCount       = args.Length;

            if (argumentCount == 1)
            {
                object value = args[0];
                serializedArguments = SimplisticJsSerializer.Serialize(value);
            }
            else if (argumentCount > 1)
            {
                var serializedArgumentsBuilder = new StringBuilder();

                for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++)
                {
                    object value           = args[argumentIndex];
                    string serializedValue = SimplisticJsSerializer.Serialize(value);

                    if (argumentIndex > 0)
                    {
                        serializedArgumentsBuilder.Append(", ");
                    }
                    serializedArgumentsBuilder.Append(serializedValue);
                }

                serializedArguments = serializedArgumentsBuilder.ToString();
            }

            object result = Evaluate(string.Format("{0}({1});", functionName, serializedArguments));

            return(result);
        }
        protected override object InnerCallFunction(string functionName, params object[] args)
        {
            string functionCallExpression;
            int    argumentCount = args.Length;

            if (argumentCount > 0)
            {
                string[] serializedArgs = new string[argumentCount];

                for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++)
                {
                    object value           = args[argumentIndex];
                    string serializedValue = SimplisticJsSerializer.Serialize(value);

                    serializedArgs[argumentIndex] = serializedValue;
                }

                var           stringBuilderPool   = StringBuilderPool.Shared;
                StringBuilder functionCallBuilder = stringBuilderPool.Rent();
                functionCallBuilder.Append(functionName);
                functionCallBuilder.Append("(");

                for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++)
                {
                    string serializedValue = serializedArgs[argumentIndex];

                    if (argumentIndex > 0)
                    {
                        functionCallBuilder.Append(", ");
                    }
                    functionCallBuilder.Append(serializedValue);
                }

                functionCallBuilder.Append(");");

                functionCallExpression = functionCallBuilder.ToString();
                stringBuilderPool.Return(functionCallBuilder);
            }
            else
            {
                functionCallExpression = string.Format("{0}();", functionName);
            }

            object result = Evaluate(functionCallExpression);

            return(result);
        }