public static List <DataBindingModifierTypeRegistration> GetForType(Type type)
        {
            lock (Registrations)
            {
                if (type == null)
                {
                    return(new List <DataBindingModifierTypeRegistration>(Registrations));
                }

                List <DataBindingModifierTypeRegistration> candidates = Registrations.Where(r => r.DataBindingModifierType.CompatibleTypes.Any(t => t == type)).ToList();

                // If there are multiple operators with the same description, use the closest match
                foreach (IGrouping <string, DataBindingModifierTypeRegistration> displayDataBindingModifiers in candidates.GroupBy(r => r.DataBindingModifierType.Name).Where(g => g.Count() > 1).ToList())
                {
                    DataBindingModifierTypeRegistration closest = displayDataBindingModifiers.OrderByDescending(r => r.DataBindingModifierType.CompatibleTypes.Contains(type)).FirstOrDefault();
                    foreach (DataBindingModifierTypeRegistration displayDataBindingModifier in displayDataBindingModifiers)
                    {
                        if (displayDataBindingModifier != closest)
                        {
                            candidates.Remove(displayDataBindingModifier);
                        }
                    }
                }

                return(candidates);
            }
        }
        public static void Remove(DataBindingModifierTypeRegistration typeRegistration)
        {
            lock (Registrations)
            {
                if (!Registrations.Contains(typeRegistration))
                {
                    throw new ArtemisCoreException($"Data binding modifier type store does not contain modifier type '{typeRegistration.DataBindingModifierType.Name}'");
                }

                Registrations.Remove(typeRegistration);
                typeRegistration.IsInStore = false;
            }

            OnDataBindingModifierRemoved(new DataBindingModifierTypeStoreEvent(typeRegistration));
        }
        public static DataBindingModifierTypeRegistration Add(DataBindingModifierType modifierType)
        {
            DataBindingModifierTypeRegistration typeRegistration;

            lock (Registrations)
            {
                if (Registrations.Any(r => r.DataBindingModifierType == modifierType))
                {
                    throw new ArtemisCoreException($"Data binding modifier type store already contains modifier '{modifierType.Name}'");
                }

                typeRegistration = new DataBindingModifierTypeRegistration(modifierType, modifierType.PluginInfo.Instance)
                {
                    IsInStore = true
                };
                Registrations.Add(typeRegistration);
            }

            OnDataBindingModifierAdded(new DataBindingModifierTypeStoreEvent(typeRegistration));
            return(typeRegistration);
        }