fully fleshed out... time for testing