public LogicalValue Resolve(Value source, LocalCodeExecutionContext localCodeExecutionContext, ResolverOptions options, bool forInheritance)
        {
#if DEBUG
            //Log($"source = {source}");
#endif

            var sourceKind = source.KindOfValue;

            switch (sourceKind)
            {
            case KindOfValue.NullValue:
                return(ValueConvertor.ConvertNullValueToLogicalValue(source.AsNullValue, _context));

            case KindOfValue.LogicalValue:
                return(source.AsLogicalValue);

            case KindOfValue.NumberValue:
                return(ValueConvertor.ConvertNumberValueToLogicalValue(source.AsNumberValue, _context));

            case KindOfValue.StrongIdentifierValue:
            {
                ReasonOfFuzzyLogicResolving reasonOfFuzzyLogicResolving = null;

                if (forInheritance)
                {
                    reasonOfFuzzyLogicResolving = new ReasonOfFuzzyLogicResolving()
                    {
                        Kind = KindOfReasonOfFuzzyLogicResolving.Inheritance
                    };
                }

                return(ValueConvertor.ConvertNumberValueToLogicalValue(_context.DataResolversFactory.GetFuzzyLogicResolver().Resolve(source.AsStrongIdentifierValue, reasonOfFuzzyLogicResolving, localCodeExecutionContext, options), _context));
            }


            case KindOfValue.FuzzyLogicNonNumericSequenceValue:
            {
                ReasonOfFuzzyLogicResolving reasonOfFuzzyLogicResolving = null;

                if (forInheritance)
                {
                    reasonOfFuzzyLogicResolving = new ReasonOfFuzzyLogicResolving()
                    {
                        Kind = KindOfReasonOfFuzzyLogicResolving.Inheritance
                    };
                }

                return(ValueConvertor.ConvertNumberValueToLogicalValue(_context.DataResolversFactory.GetFuzzyLogicResolver().Resolve(source.AsFuzzyLogicNonNumericSequenceValue, reasonOfFuzzyLogicResolving, localCodeExecutionContext, options), _context));
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(sourceKind), sourceKind, null);
            }
        }