""" His point is that no counter-example is needed. The solution in which the client/caller/user simply passes in the desired Churner behaviour to the churn method is as simple as it gets. """
Fredrik didn't suggest we pass in a Churner to the churn method. He suggested we use a superclass with a template method (a different GoF design pattern). A subclass would provide a method that returns a particular kind of churner, which would be called by the superclass "churn" method. And that's fine; it solves the example problem I proposed nicely. It does fail to solve the case of wanting to adapt something to something else when neither one of those things are "self", though. Nothing in the example code requires this, but it does happen.
""" Otherwise, the caller would still need to call the provideAdapter somewhere. """
You're right that it needs to happen before the call happens, but the caller isn't required to do this. The provideAdapter call is typically done outside of any direct caller. In Zope, it's typically not even done by writing Python; it's done instead by writing ZCML. You may hate this, but it does mean that you don't need to modify the caller.
Fredrik didn't suggest we pass in a Churner to the churn method. He suggested we use a superclass with a template method (a different GoF design pattern). A subclass would provide a method that returns a particular kind of churner, which would be called by the superclass "churn" method. And that's fine; it solves the example problem I proposed nicely. It does fail to solve the case of wanting to adapt something to something else when neither one of those things are "self", though. Nothing in the example code requires this, but it does happen.
""" Otherwise, the caller would still need to call the provideAdapter somewhere. """
You're right that it needs to happen before the call happens, but the caller isn't required to do this. The provideAdapter call is typically done outside of any direct caller. In Zope, it's typically not even done by writing Python; it's done instead by writing ZCML. You may hate this, but it does mean that you don't need to modify the caller.