VERY BIG TODO:
- give a contructor a way to fail, so that no object will be created at all