role() :: :subscriber | :publisher
choose(module(), role(), String.t()) :: atom()
name(module(), role(), String.t(), pos_integer()) :: atom()