all methods implemented, need to test