>  I think my main concern is code duplication / what is in my eyes ugly code / a lot of code that is not completely straight forward to understand

Just because you suck at nodejs doesn't mean others do <3 jk, I've definiteltly considered it while coding this PR but decided against it cause I just wanted to get it done >.> I'll clean up the code, but yeah I really don't know if async is important here (I mean it is async but it runs serially).

I'm thinking.. what if I implemented some sort of runHookPromise() function which returns success/error with a CustomEventEmitter and just proxies through a QueryChainer?

This way we can just do var q = new QueryChainer(); q.push(runHook1); q.push(runDestroy); q.push(runAfterHook1); q.push(runHook2); q.push(.....)l q.runSerially() (or q.run() if we want some sort of {async: true} option.

Let me know if that option seems better to you, ideally I'd like to keep both the non promise and callback functionality as this would give some flexibility for developers in the future for Sequelize (more importantly when we add plugins).

Let me know what you think :D