On Wed, Apr 4, 2012 at 8:00 PM, Vincent Massol <[email protected]> wrote:
> Hi Thomas/All,
>
> All looks good except CM.lookupComponent() which Ï don't like a lot for the 
> following reasons:
> * It's a bit long. It's longer than before and it would be nicer if it were 
> as short as before or even shorter ;)
> * It's not symmetrical with other lookups like lookupList and lookupMap, 
> which should theoretically be lookupComponentList() and lookupComponentMap() 
> which are even longer
>
> Thus I'd prefer that the new API for lookup be named differently.
>
> I propose to use "resolve":
>
> CM.resolve(Type)
> CM.resolveList(Type)
> CM.resolveMap(Type)
>
> Alternative:
>
> CM.getInstance(Type)
> CM.getInstanceList(Type)
> CM.getInstanceMap(Type)
>
> or even the short:
>
> CM.get(Type)
> CM.getList(Type)
> CM.getMap(Type)
>
> For information Guice uses getInstance(), Picocontainer uses 
> getComponentInstance().
>
> WDYT?

"get" sounds a bit lightweight to be for something supposed to also
initialize what you ask but if Guice use that I guess it means it's
OK.

I'm OK with any of theses suggestions so I will apply the voted one.

>
> My preference goes to getInsta  nce():
> * users are tempted by default to start typing "get" to get an instance and 
> then they'll see getInstance in autocompletion and choose it.
> * it's the same as Guice

"getInstance" is longer than "lookup" ;)

>
> Thanks
> -Vincent
>
> On Mar 6, 2012, at 2:51 PM, Thomas Mortagne wrote:
>
>> It's committed.
>>
>> Would be nice to have comments on the new APIs (suggest better naming,
>> etc...). It's a very important API and we really need to have
>> something we are sure of before 4.0 final.
>>
>> On Mon, Mar 5, 2012 at 6:53 PM, Thomas Mortagne
>> <[email protected]> wrote:
>>> Hi guys,
>>>
>>> I'm almost done but there is one little detail left: for easier
>>> retro-compatibility I would like to introduce a new @Role annotation
>>> and deprecate the @ComponentRole annotation. The idea is that Role
>>> will "officially" take into account generic parameters while
>>> ComponentRole does not. That way no existing component role behavior
>>> will be broken or require crappy retro-compatibility like registering
>>> automatically both generic and non generic roles (what I started to do
>>> at first).
>>>
>>> On Thu, Mar 1, 2012 at 6: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
>>>
>>>
>>>
>>> --
>>> Thomas Mortagne
>>
>>
>>
>> --
>> 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



-- 
Thomas Mortagne
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to