more convenient boilerplate setup