[
https://issues.apache.org/jira/browse/TAP5-1611?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14032513#comment-14032513
]
Thiago H. de Paula Figueiredo edited comment on TAP5-1611 at 6/16/14 3:04 PM:
------------------------------------------------------------------------------
Hi, Lance!
Thanks for reviewing my commit. The more people looking at Tapestry sources,
the better. :)
1) I agree with your suggestion. I'll do it today.
2) There's no classloading problem in this case, because the implementation of
this feature happens *before* the classes are changed. In addition, the
implementation itself, in the end, uses class names, not the class instances
themselves, as the advised method receives a String. I've chosen to model the
contributions as Class instances because it's type-safe, IDE
autocompletion-aware and less error-prone than strings. My first attempt was
using the component, mixin and page's logical names (lib/name) and advising
ComponentClassResolver, but then it didn't replace components and mixins
defined using @Component or @MixinClasses. The solution was to advise
ComponentInstantiatorSource.getInstantiator(String classname), which has no
notion of page, component or mixin. Class instances are indeed valid in
AppModule.
was (Author: thiagohp):
Hi, Lance!
Thanks for reviewing my commit. The more people looking at Tapestry sources,
the better. :)
1) I agree with your suggestion. I'll do it today.
2) There's no classloading problem in this case, because the implementation of
this feature happens *before* the classes are changed. Actually, it works in
Tapestry-IoC. In addition, the implementation itself, in the end, uses class
names, not the class instances themselves, as the advised method receives a
String. I've chosen to model the contributions as Class instances because it's
type-safe, IDE autocompletion-aware and less error-prone than strings. My first
attempt was using the component, mixin and page's logical names (lib/name) and
advising ComponentClassResolver, but then it didn't replace components and
pages defined using @Component or @MixinClasses. The solution was to advise
ComponentInstantiatorSource.getInstantiator(String classname), which has no
notion of page, component or mixin. Class instances are indeed valid in
AppModule.
> out-of-the-box way in Tapestry for replacing components
> -------------------------------------------------------
>
> Key: TAP5-1611
> URL: https://issues.apache.org/jira/browse/TAP5-1611
> Project: Tapestry 5
> Issue Type: New Feature
> Components: tapestry-core
> Affects Versions: 5.3
> Reporter: Jens Breitenstein
> Assignee: Thiago H. de Paula Figueiredo
> Priority: Minor
> Labels: component, month-of-tapestry
> Fix For: 5.4
>
>
> It would be nice to allow global component replacement by a different
> component class (or derived version from the original) compared to the field
> type provided. So @InjectComponent would behave more or less like @Inject for
> services without the need of Interfaces.
> NOTE:
> current workaround is decorating ComponentInstantiatorSource
> As Thiago outlines my workaround is sub-optimal as it bases on internal
> classes which might subject to change without notice. He suggests to have an
> Service we can contribute our "overrides" to. Replaceing components would
> introduce a new level of flexibility to change implementations without
> touching tml's at all. Naturally ServiceBinder was not my suggested place for
> this new kind of "binding", seems to be a misunderstanding. From a functional
> point of view I was just thinking about something like...
> public static void bind(final ComponentBinder binder)
> {
> binder.bind(ComponentA,class, ComponentBderivedFromA.class);
> }
> ...this, as an example.
--
This message was sent by Atlassian JIRA
(v6.2#6252)