Add some docs and get a bit more elaborate with class hierarchy