use interfaces instead of classes