+1 Thanks, Marius
On Thu, Mar 1, 2012 at 7:20 PM, Thomas Mortagne <[email protected]> wrote: > Hi devs, > > I recently modified component manager internals and changed the role > used as key in the map from Class to Type so that it properly make a > difference between Provider<Toto> and Provider<Titi> without the need > to generate a special hint. > > For the one not aware of what Type is lets say it's what Class is > extending. Among other things Type is also extended by > ParameterizedType which is interesting here because it basically > contain a Class with it's generic parameters (it also indicate if the > type in included in another one but we don't care in our case ;)). > > To summarize: > * Provider is a Class > * Provider<String> is ParameterizedType > and both are Type > > That said I would like to change the whole ComponentManager and > related descriptors APIs to use Type as role instead of Class. > > = What it bring > > What it means is that it makes possible to cleanly represent a > Provider in which the generic type is meaningful right in the > ComponentDescriptor (right now the generic type is extract from the > implementation class when the provider is registered which is pretty > crappy) and simplify a lot the current implementation. > > But it also mean we could use this new "feature" for other components. > For example right now we have things like: > > @Component > public class DefaultStringDocumentReferenceResolver implements > DocumentReferenceResolver<String> > > and > > @Component > @Named("default/reference") > public class DefaultReferenceDocumentReferenceResolver implements > DocumentReferenceResolver<EntityReference> > > and injected by > > @Inject > DocumentReferenceResolver<String> resolver; > > and > > @Inject > @Named("default/reference") > DocumentReferenceResolver<EntityReference> resolver; > > Having Type used as role means that we could have: > > @Inject > DocumentReferenceResolver<String> resolver; > > and > > @Inject > DocumentReferenceResolver<EntityReference> resolver; > > = What it breaks > > So what's the catch ? > > Basically it would break any code that currently programmatically > register or unregister Provider since It would remove the current hack > to discover the Provider parameter (assuming that the > ComponentDescriptor now provide the complete role). But that's OK IMO > given that Provider support is very recent and I doubt it's a common > use case. > > We would obviously keep and deprecate all the existing APIs based on > Class which are pretty easy to implement since Class extends Type. > Even if removing them would not cause any issue when you build it's > not binary compatible since it's not the same method signature. > > So WDYT ? > > Here is my +1 and since we are starting a new major version it sounds > a good occasion so introduce such change. > > -- > Thomas Mortagne > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

