added generic contracts.
Might have to think of how usable it is when you have to explicitly get access to the applied contract in order to instantiate it. Maybe more usable when we do it using reflection to check for a method, but this might be ugly.