
On Sunday 12 April 2009 15:16:04 glyph@divmod.com wrote:
Sorry for that; it certainly wasn't my intention. I meant just what I said: I find it difficult to communicate about. Perhaps I should have said, "trust me, my experience suggests that it is".
I'm too thin-skinned sometimes, so just forget what I said :-)
And this is why the explanation of its wrong-ness is difficult. I know that you could get the same effect by doing (IFoo, IUsernamePassword) -> IBar and (IFoo, IHostnamePath).
Actually I just discovered some of those flaws in Zope's adapter registry, so you're right that multi-adapters are not that easy to implement.
Would the specifics of your application allow you to introduce an intermediary IProtocolFactoryConfigurer interface, with .config* methods that would return the actual ProtocolFactory, as with my IBarFactory above? "IBar" here would be IProtocolFactory; sorry for the confusion with the word "factory".
I guess that would be sufficient, an "adapter factory" in some sense. In fact, I already came up with something similar, but found it too cumbersome (attached). Maybe, instead of supporting multi-adapters, a recipe like yours could be added to the documentation.
So ConfigurationObject is purely for the IFooFactory implementation?
Yep. In our case, AMQP protocol instances require some arguments to be passed (e.g. username and password for connecting to the broker). BTW, I just realized that we should use usage.Options instead of our own config object.
Thanks for that link, by the way, that's a great introduction to zope.component. Not one I'd seen before.
It covers pretty much everything about adapters and interfaces, I found it very detailed and useful.
I'm still not a big fan of multi-adapters, but the code's so short, and so non-invasive (in particular I don't believe it'll affect the performance of "normal", single adaptation), that I probably wouldn't argue too hard against it. Feel free to file that ticket, although I won't promise that somebody *else* won't come along and object. In any case, you can start using it right away if it suits you :).
It's very simple and elegant, I like it :-) I think it's a good idea to include it, or maybe add an entry to the FAQ. Thanks!