Extract all attribute changed work to its own method

This will make easier to hook on this feature to customize the behavior
Make enum feature work with dirty methods

To make this possible we have to override the save_changed_attribute
hook.
Add more tests for the dirty feature for enums
Add CHANGELOG entry [ci skip]