At some point I'd like to get rid of all these different factory methods, so I'd rather keep the return types as generic as possible.