use methodsInProtocol:, added removeProtocolIfEmpty:
use keysDo: