Why: to allow devs to create additional upgrade logic
How: by registering a hook function and triggering it, instead of calling the function directly