Interesting, you gave each 'action' a class.
I implemented the same thing in my firmware, but then threw it away for the 'encoding' style that TMK uses.
I had a few issues with it, one being related to static global objects and their constructors that weren't being removed when unused.
The class solution allows you to not compile code when it's not used by the keymap. You can emulate that with defines for the 'encoding' technique, but it's not so clean. Eventually I'll experiment and see if I can find a solution that works 'automagically' for the 'encoding' technique.