i realize this looks a bit duplicated, but the inheritance hierarchy makes it annoyingly hard to do anything more DRY