this is an unnecessary level of abstraction