I've done something like this. I set up a listener interface for my objects that have to be aware of changes made somewhere else. Then in the aware object(the one that causes/knows about the changes) I kept an array/vector of the objects that were registered as listeners then had to run through a for loop and hit each one whenever there was a change. It makes it slightly inconvenient because all your objects that are listeners have to be custom(although just barely) so that they know what to do when you tell them you copied or pasted something. You could set everything up to listen to the same reports no matter what kind of report it was, or you could go so far as to break each different type of action into it's own set of listeners.
Its a pain to setup sometimes, but it really makes updating stuff and triggering special events
alot easier. If you need more details, I can give you some examples of what I did.
HTH