//#######################
        // GetHandler

        public static IPropertyHandler GetHandler(SerializedProperty property)
        {
            if (property == null)
            {
                throw new System.ArgumentNullException("property");
            }

            IPropertyHandler result = _handlerCache.GetHandler(property);

            if (result != null)
            {
                return(result);
            }

            //TEST FOR SPECIAL CASE HANDLER
            var fieldInfo = ScriptAttributeUtility.GetFieldInfoFromProperty(property);

            if (fieldInfo != null && System.Attribute.IsDefined(fieldInfo, typeof(PropertyAttribute)))
            {
                var attribs = fieldInfo.GetCustomAttributes(typeof(PropertyAttribute), false) as PropertyAttribute[];
                //if (attribs.Length > 1)
                //{
                //    if (attribs.Any((a) => a is SPPropertyAttribute))
                //    {
                //        result = new MultiPropertyAttributePropertyHandler(fieldInfo, attribs);
                //        _handlerCache.SetHandler(property, result);
                //        return result;
                //    }
                //}
                //else if (attribs[0] is SPPropertyAttribute)
                //{
                //    result = new SPPropertyAttributePropertyHandler(fieldInfo, attribs[0] as SPPropertyAttribute);
                //    _handlerCache.SetHandler(property, result);
                //    return result;
                //}

                if (attribs.Any((a) => a is SPPropertyAttribute))
                {
                    result = new MultiPropertyAttributePropertyHandler(fieldInfo, attribs);
                    _handlerCache.SetHandler(property, result);
                    return(result);
                }
            }

            //USE STANDARD HANDLER if none was found
            var handler = StandardPropertyHandler.Instance;

            _handlerCache.SetHandler(property, handler);
            return(handler);
        }
        //#######################
        // GetHandler
        
        public static IPropertyHandler GetHandler(SerializedProperty property)
        {
            if (property == null) throw new System.ArgumentNullException("property");

            IPropertyHandler result = _handlerCache.GetHandler(property);
            if (result != null)
            {
                return result;
            }

            //TEST FOR SPECIAL CASE HANDLER
            var fieldInfo = ScriptAttributeUtility.GetFieldInfoFromProperty(property);
            if(fieldInfo != null && System.Attribute.IsDefined(fieldInfo, typeof(PropertyAttribute)))
            {
                var attribs = fieldInfo.GetCustomAttributes(typeof(PropertyAttribute), false) as PropertyAttribute[];
                //if (attribs.Length > 1)
                //{
                //    if (attribs.Any((a) => a is SPPropertyAttribute))
                //    {
                //        result = new MultiPropertyAttributePropertyHandler(fieldInfo, attribs);
                //        _handlerCache.SetHandler(property, result);
                //        return result;
                //    }
                //}
                //else if (attribs[0] is SPPropertyAttribute)
                //{
                //    result = new SPPropertyAttributePropertyHandler(fieldInfo, attribs[0] as SPPropertyAttribute);
                //    _handlerCache.SetHandler(property, result);
                //    return result;
                //}

                if (attribs.Any((a) => a is SPPropertyAttribute))
                {
                    result = new MultiPropertyAttributePropertyHandler(fieldInfo, attribs);
                    _handlerCache.SetHandler(property, result);
                    return result;
                }
            }

            //USE STANDARD HANDLER if none was found
            var handler = StandardPropertyHandler.Instance;
            _handlerCache.SetHandler(property, handler);
            return handler;
        }