/// <summary>
        /// Call all the registered custom indexer for an object of a specific type. See <see cref="CustomObjectIndexerAttribute"/>.
        /// </summary>
        /// <param name="documentId">Document id.</param>
        /// <param name="obj">Object to index.</param>
        /// <param name="documentIndex">Document where the indexed object was found.</param>
        /// <param name="so">SerializedObject representation of obj.</param>
        /// <param name="multiLevel">If true, calls all the indexer that would fit the type of the object (all assignable type). If false only check for an indexer registered for the exact type of the Object.</param>
        protected void CallCustomIndexers(string documentId, int documentIndex, Object obj, SerializedObject so, bool multiLevel = true)
        {
            var objectType = obj.GetType();
            List <CustomIndexerHandler> customIndexers;

            if (!multiLevel)
            {
                if (!CustomIndexers.TryGetValue(objectType, out customIndexers))
                {
                    return;
                }
            }
            else
            {
                customIndexers = new List <CustomIndexerHandler>();
                foreach (var indexerType in CustomIndexers.types)
                {
                    if (indexerType.IsAssignableFrom(objectType))
                    {
                        customIndexers.AddRange(CustomIndexers.GetHandlers(indexerType));
                    }
                }
            }

            var indexerTarget = new CustomObjectIndexerTarget
            {
                id               = documentId,
                documentIndex    = documentIndex,
                target           = obj,
                serializedObject = so,
                targetType       = objectType
            };

            foreach (var customIndexer in customIndexers)
            {
                customIndexer(indexerTarget, this);
            }
        }
 /// <summary>
 /// Checks if we have a custom indexer for the specified type.
 /// </summary>
 /// <param name="type">Type to lookup</param>
 /// <param name="multiLevel">Check for subtypes too.</param>
 /// <returns>True if a custom indexer exists, otherwise false is returned.</returns>
 protected bool HasCustomIndexers(Type type, bool multiLevel = true)
 {
     return(CustomIndexers.HasCustomIndexers(type, multiLevel));
 }