passes linting, probably doesn't work. tests next