protocols and multimethods out the wazoo