/// <summary>
        ///
        /// </summary>
        /// <param name="property"></param>
        public AbstractSitecoreDataHandler GetDataHandler(SitecoreProperty property)
        {
            AbstractSitecoreDataHandler newHandler;

            if (property.Attribute.DataHandler != null)
            {
                Type dataType = property.Attribute.DataHandler;
                if (typeof(AbstractSitecoreDataHandler).IsAssignableFrom(dataType))
                {
                    try
                    {
                        newHandler = (AbstractSitecoreDataHandler)dataType.Assembly.CreateInstance(dataType.FullName);
                    }
                    catch (Exception ex)
                    {
                        throw new MapperException(
                                  "Failed to create instance of the data handler {0} configured on property {0} on class {1}"
                                  .Formatted(dataType.FullName, property.Property.Name,
                                             property.Property.ReflectedType.FullName), ex);
                    }
                }
                else
                {
                    throw new MapperException(
                              "Custom data handler does not inherit from AbstractSitecoreDataHandler for {0} on class"
                              .Formatted(property.Property.Name, property.Property.ReflectedType.FullName));
                }
            }
            else
            {
                AbstractSitecoreDataHandler handler = Datas.FirstOrDefault(x => x.WillHandle(property, Datas, Classes));

                if (handler == null)
                {
                    throw new NotSupportedException("No data handler for: \n\r Class: {0} \n\r Member: {1} \n\r Attribute: {2}"
                                                    .Formatted(
                                                        property.Property.ReflectedType.FullName,
                                                        property.Property.Name,
                                                        property.Attribute.GetType().FullName
                                                        ));
                }

                newHandler = handler.Clone() as AbstractSitecoreDataHandler;
            }
            newHandler.ConfigureDataHandler(property);

            return(newHandler);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="property"></param>
        public AbstractSitecoreDataHandler GetDataHandler(SitecoreProperty property)
        {
            AbstractSitecoreDataHandler handler = Datas.FirstOrDefault(x => x.WillHandle(property, Datas, Classes));

            if (handler == null)
            {
                throw new NotSupportedException("No data handler for: \n\r Class: {0} \n\r Member: {1} \n\r Attribute: {2}"
                                                .Formatted(
                                                    property.Property.ReflectedType.FullName,
                                                    property.Property.Name,
                                                    property.Attribute.GetType().FullName
                                                    ));
            }

            var newHandler = handler.Clone() as AbstractSitecoreDataHandler;

            newHandler.ConfigureDataHandler(property);

            return(newHandler);
        }