All hook handler functions share the same {`func(e T) error`} signature and expect
the user to call e.Next() if they want to proceed with the execution chain.
If you need to access the app instance from inside a hook handler, prefer using the
e.App field instead of reusing a parent scope app variable because the hook could be part
of a DB transaction and can cause deadlock.
Also avoid using global mutex locks inside a hook handler because it could be invoked recursively (e.g. cascade delete) and can cause deadlock.