Add an AbstractProperty class to make implementations easier
Change exception used to have one with a more appropriate name