need to iron out the test bench, but it looks good