add a bunch more methods and tests