how come we need this base class (and corresponding meta)

also feels a little odd given that the different types have e.g. different `__init__` signatures