Add more constraints and a new trait.
Refactoring Dispatch.