`@callback` is a pretty generic name.  Perhaps this should be `@on_change_callback`.

Also, I prefer non-Seattle style method defs (e.g. `def on_change(&block)`).