By having all functions share the signature we enable caching of dispatchers to avoid branches in use.