lots of this functionality should be on instance methods