@callback compose(context1 :: struct(), context2 :: struct(), strategy :: atom()) :: struct()
@callback new(attrs :: keyword()) :: struct()
@callback propagate(context :: struct(), target_module :: module()) :: struct()