done: defprotocol (with some stuff pending)