public void Add(IRelevantObject relevantObject, bool propagate = true) { // Don't add if this layer is over the max if (Objects.GetCount() > ParentCollection.MaxObjects) { relevantObject.Dispose(); return; } var previousCollection = GetAllPreviousLayersCollection(); if (Objects.FindSimilar(relevantObject, ParentCollection.AcceptableDifference, out var similarObject)) { // Consume object similarObject.Consume(relevantObject); // Dispose this relevant object relevantObject.Dispose(); // Set DoNotDispose for the GenerateNewObjects method if (!similarObject.DoNotDispose && !similarObject.DefinitelyDispose && previousCollection.FindSimilar(similarObject, ParentCollection.AcceptableDifference, out _)) { similarObject.DefinitelyDispose = true; } else { similarObject.DoNotDispose = true; } return; // return so the relevant object doesn't get added } if (previousCollection != null && previousCollection.FindSimilar(relevantObject, ParentCollection.AcceptableDifference, out _)) { // Don't consume because that causes inheritance issues // Dispose this relevant object relevantObject.Dispose(); return; // return so the relevant object doesn't get added } // Set DoNotDispose for the GenerateNewObjects method relevantObject.DoNotDispose = true; // Insert the new object Objects.SortedInsert(relevantObject); // Set layer variable in object relevantObject.Layer = this; // Propagate changes if (!propagate || NextLayer == null) { return; } NextLayer.GenerateNewObjects(); }