/// <summary>
        /// Run the script and return the last value evaluated. Executing a declaration function
        /// or a global object literal, will load the function or object in the JavaScript context.
        /// </summary>
        /// <param name="script"></param>
        /// <returns>
        /// </returns>
        public object Run(string script)
        {
            var o = this._javaScriptContextImplementation.Run(script);

            if (o != null)
            {
                if (_javaScriptContextImplementation.IsJavaScriptArray(o))
                {
                    o = _javaScriptContextImplementation.JavaScriptArrayToNETArray(o);
                }
                else if (_javaScriptContextImplementation.IsJavaScriptObject(o))
                {
                    var     dic = _javaScriptContextImplementation.JavaScriptObjectToNETDictionary(o);
                    dynamic d   = new DynamicJavaScriptInstance(dic);
                    o = d;
                }
            }
            return(o);
        }
        /// <summary>
        /// Get the value of a property using the property syntax
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (!_dic.ContainsKey(binder.Name))
            {
                throw new ApplicationException(String.Format("property '{0}' not defined in object", binder.Name));
            }

            result = _dic[binder.Name];

            if (___globalJavaScriptContext.IsJavaScriptDate(result))
            {
                result = ___globalJavaScriptContext.JavaScriptDateToNETDateTime(result);
            }
            // If we have to return an array we replace all the element of the array that
            // are an object by our wrapper JavaScriptInstance around the object.
            // So we can continue to get the C# dynamic syntax
            if (___globalJavaScriptContext.IsJavaScriptArray(result))
            {
                result = MakeDynamicObjectArray(
                    ___globalJavaScriptContext.JavaScriptArrayToNETArray(result)
                    );
            }
            // If the value returned  a JavaScript object we return it as a
            // JavaScriptInstance so we can handle the dynamic aspect of it in C#
            else if (___globalJavaScriptContext.IsJavaScriptObject(result))
            {
                var     dic = ___globalJavaScriptContext.JavaScriptObjectToNETDictionary(result);
                dynamic d   = new DynamicJavaScriptInstance(dic);
                result = d;
            }
            else
            {
                result = ___globalJavaScriptContext.JavaScriptValueTypeToNETValueType(result);
            }
            return(true);
        }