public string FormatValue(ResolutionContext context)
        {
            Type valueType = context.SourceType;
            object valueToFormat = context.SourceValue;
            IFormatterConfiguration typeSpecificFormatterConfig = null;
            string formattedValue = context.SourceValue.ToNullSafeString();

            if (context.PropertyMap != null)
            {
                foreach (IValueFormatter formatter in context.PropertyMap.GetFormatters())
                {
                    formattedValue = formatter.FormatValue(context.CreateValueContext(valueToFormat));
                    valueToFormat = formattedValue;
                }

                if (_formatterConfiguration.GetTypeSpecificFormatters().TryGetValue(valueType, out typeSpecificFormatterConfig))
                {
                    if (!context.PropertyMap.FormattersToSkipContains(typeSpecificFormatterConfig.GetType()))
                    {
                        var typeSpecificFormatter = new ValueFormatter(typeSpecificFormatterConfig);
                        formattedValue = typeSpecificFormatter.FormatValue(context);
                        valueToFormat = formattedValue;
                    }
                }
            }
            else if (_formatterConfiguration.GetTypeSpecificFormatters().TryGetValue(valueType, out typeSpecificFormatterConfig))
            {
                var typeSpecificFormatter = new ValueFormatter(typeSpecificFormatterConfig);
                formattedValue = typeSpecificFormatter.FormatValue(context);
                valueToFormat = formattedValue;
            }

            foreach (IValueFormatter formatter in _formatterConfiguration.GetFormatters())
            {
                Type formatterType = GetFormatterType(formatter);
                if (CheckPropertyMapSkipList(context, formatterType) &&
                    CheckTypeSpecificSkipList(typeSpecificFormatterConfig, formatterType))
                {
                    formattedValue = formatter.FormatValue(context.CreateValueContext(valueToFormat));
                    valueToFormat = formattedValue;
                }
            }

            return formattedValue;
        }