Defined some abstract classes (in the wrong package) to help design this thing.