bool hasChanges([bool Function(U modified)? fn]) { return added.isNotEmpty || removed.isNotEmpty || (fn != null ? modified.any(fn) : modified.isNotEmpty); }