protocol CommandProcessor { static var commandType: CommandType { get } var results: PageGenerationResults { get } init(content: Content, results: PageGenerationResults, language: ContentLanguage) func process(_ arguments: [String], markdown: Substring) -> String } extension CommandProcessor { func invalid(_ markdown: Substring) { results.invalid(command: Self.commandType, markdown) } }