These are actually substantially different from version 2. I've simplified the code and improved the error handling across the interfaces. Incidentally, this should make adding new properties much simpler (see patch 6).