this is a more convenient abstraction