issue #2 contracts use interfaces not abstract classes