public override object Call(IObj that, object[] args)
        {
            if (that.Class != ObjClass.Number || !that.HasValue())
                throw new ShouldThrowTypeError();

            return (that as ValueObj).Value;
        }
        public override object Call(IObj that, object[] args)
        {
            if (that.Class != ObjClass.Boolean || !that.HasValue())
                throw new ShouldThrowTypeError();

            return JsTypeConverter.ToBoolean((that as ValueObj).Value) ? "true" : "false";
        }
        public override object Call(IObj that, object[] args)
        {
            if (that.Class != ObjClass.Number || !that.HasValue())
                throw new ShouldThrowTypeError();

            //TODO: this should handle args[0] (radix) correctly.
            return JsTypeConverter.ToString((that as ValueObj).Value);
        }
        public override object Call(IObj that, object[] args)
        {
            if (that.Class != ObjClass.Number || !that.HasValue())
                throw new ShouldThrowTypeError();

            var fractions = HasArgs(args) ? JsTypeConverter.ToInt32(args[0]) : 0;
            var dbl = JsTypeConverter.ToNumber((that as ValueObj).Value);
            return dbl.ToString("f" + fractions, CultureInfo.InvariantCulture);
        }
        public override object Call(IObj that, object[] args)
        {
            if (that.Class != ObjClass.Number || !that.HasValue())
                throw new ShouldThrowTypeError();

            var dbl = JsTypeConverter.ToNumber((that as ValueObj).Value);

            if (double.IsNaN(dbl) || double.IsInfinity(dbl) || !HasArgs(args) || args[0] is Undefined)
                return JsTypeConverter.ToString(dbl);

            var precision = HasArgs(args) ? JsTypeConverter.ToInt32(args[0]) : 1;
            var asString = dbl.ToString("e23", CultureInfo.InvariantCulture);
            var numDecimals = asString.IndexOfAny(new char[] { '.', 'e' });

            precision -= (numDecimals == -1 ? asString.Length : numDecimals);

            return dbl.ToString("f" + (precision < 1 ? 1 : precision), CultureInfo.InvariantCulture);
        }