a generic protocol template... FORK ME!