/// <inheritdoc />
        public async ContextObjectPromise GetValue(ContextObject contextObject, ScopeData scopeData)
        {
            var leftValue = await LeftExpression.GetValue(contextObject, scopeData);

            FormatterArgumentType[] arguments;
            if (RightExpression != null)
            {
                arguments = new[]
                {
                    new FormatterArgumentType(0, null, (await RightExpression.GetValue(contextObject, scopeData)).Value)
                };
            }
            else
            {
                arguments = new FormatterArgumentType[0];
            }


            var operatorFormatterName = "op_" + Operator.OperatorType;

            if (Cache == null)
            {
                Cache = leftValue.PrepareFormatterCall(
                    leftValue.Value?.GetType() ?? typeof(object),
                    operatorFormatterName,
                    arguments,
                    scopeData);
            }

            if (Cache != null /* && !Equals(Cache.Value, default(FormatterCache))*/)
            {
                return(scopeData.ParserOptions.CreateContextObject(".",
                                                                   await scopeData.ParserOptions.Formatters.Execute(Cache, leftValue.Value, scopeData.ParserOptions, arguments),
                                                                   contextObject.Parent));
            }

            return(scopeData.ParserOptions.CreateContextObject(".",
                                                               null,
                                                               contextObject.Parent));
        }