implement protocol interpreter