@spec call({atom(), any()}, [any()], String.t()) :: {any(), any()}
@spec validate(atom() | tuple(), any(), atom()) :: any()