this seems like enough meat to put in its own method