/// <summary>
        /// Sorts a list of items according to the execution order of each items
        /// associated <see cref="Component"/> type.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="items"></param>
        /// <param name="typeOfItem"></param>
        /// <param name="reverse"></param>
        public void SortTypedItems <T>(IList <T> items, Func <T, Type> typeOfItem, bool reverse)
        {
            T[] itemArray = items.ToArray();
            IndexedTypeItem[] indexedTypes = new IndexedTypeItem[items.Count];
            for (int i = 0; i < indexedTypes.Length; i++)
            {
                indexedTypes[i].Type      = typeOfItem(itemArray[i]);
                indexedTypes[i].ItemIndex = i;
                indexedTypes[i].TypeIndex = this.GetSortIndex(indexedTypes[i].Type);
            }

            if (reverse)
            {
                Array.Sort(indexedTypes, (a, b) => b.TypeIndex - a.TypeIndex);
            }
            else
            {
                Array.Sort(indexedTypes, (a, b) => a.TypeIndex - b.TypeIndex);
            }

            for (int i = 0; i < indexedTypes.Length; i++)
            {
                items[i] = itemArray[indexedTypes[i].ItemIndex];
            }
        }
        /// <summary>
        /// Sorts a list of <see cref="Component"/> types according to their execution order.
        /// </summary>
        /// <param name="types"></param>
        /// <param name="reverse"></param>
        public void SortTypes(IList <Type> types, bool reverse)
        {
            IndexedTypeItem[] indexedTypes = new IndexedTypeItem[types.Count];
            for (int i = 0; i < indexedTypes.Length; i++)
            {
                indexedTypes[i].Type      = types[i];
                indexedTypes[i].TypeIndex = this.GetSortIndex(indexedTypes[i].Type);
            }

            if (reverse)
            {
                Array.Sort(indexedTypes, (a, b) => b.TypeIndex - a.TypeIndex);
            }
            else
            {
                Array.Sort(indexedTypes, (a, b) => a.TypeIndex - b.TypeIndex);
            }

            for (int i = 0; i < indexedTypes.Length; i++)
            {
                types[i] = indexedTypes[i].Type;
            }
        }