I've turned this into a `notify` member function that handles the polymorphic behavior.  Much cleaner and will cause build errors if we fail to define one for a new type.