IEnumerable <Type> FilterTypeList(string nameSearch, AbstractionLevel level, Predicate <Type> predicate = null)
 {
     return(AllTypes.Where(t => t.IsClass &&
                           t.IsSubclassOf(typeof(UnityEngine.Object)) &&
                           t.IsPublic &&
                           !t.IsGenericType &&
                           CheckAbstraction(t, level) &&
                           (predicate == null || predicate(t)) &&
                           (string.IsNullOrEmpty(nameSearch) || t.FullName.Contains(nameSearch))
                           ));
 }
    private bool CheckAbstraction(Type type, AbstractionLevel level)
    {
        switch (level)
        {
        case AbstractionLevel.All:
            return(true);

        case AbstractionLevel.Concrete:
            return(!type.IsAbstract);

        default:
            return(type.IsAbstract);
        }
    }
 private void DrawAbstractionSelector()
 {
     GUILayout.BeginHorizontal(EditorStyles.toolbar, GUILayout.ExpandWidth(true), GUILayout.Height(32));
     {
         GUILayout.BeginVertical();
         {
             GUILayout.FlexibleSpace();
             Abstraction = (AbstractionLevel)EditorGUILayout.EnumPopup("Abstraction", Abstraction);
             GUILayout.FlexibleSpace();
         }
         GUILayout.EndVertical();
     }
     GUILayout.EndHorizontal();
 }