@callback initialize(map(), any()) :: :ok
@callback select([Variable.t()], map(), any()) :: Variable.t() | nil
@callback update(map(), Keyword.t()) :: :ok