lol, welcome to the conversation. i have already implemented such a check,
and this whole conversation is about the pros and cons of this check.

-igor


On 1/4/07, Martijn Dashorst <[EMAIL PROTECTED]> wrote:

For this line they are, but when MyOtherComponent extends MyComponent,
the ballpark changes a bit:

Assume:
public class MyComponent extends Component {
   protected void onattachhandler1() {//foo }
   protected void onattachhandler2() {//bar}
}

public class MyOtherComponent extends MyComponent {
    protected void onattachhandler3() { // beer }
}

then:

public MyOtherComponent() {
    add(new IAttachListener() { public void onAttach() {
onatachhandler3(); }
}

is not equivalent to:
public void MyOtherComponent:onAttach() {
    onattachhandler3();
}

because it requires you to add a call to super(). This can/will be
forgotten.

If we do so, we could add a detection system in the
Component.onAttach()/onDetach() methods that super is actually called,
with a possibility to disable that check, and would only perform such
a check in development mode (just like the serialization now).

something like:

Component.onAttach() {
    if(isAttachCalled() != null) {
        setAttachCalled(true);
    }
}
Component.isAttachCalled() {
    // defaults to true, subclasses that allow overriding can
    // return NULL.
    return false;
}

somewhere in the request cycle:

if(settings.isAttachCheckEnabled()) {
    page.visit(new AttachChecker() { if(!component.isAttachCalled())
throw ... } );
}

Martijn

On 1/4/07, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
> all these method are equivalent, suppose
>
> public class MyComponent extends Component {
>    protected void onattachhandler1() {//foo }
>    protected void onattachhandler2() {//bar}
> }
>
> now:
> public class MyComponent extends Component {
>    protected void onattach() { onattachhandler1(); onattachhandler2(); }
>    protected void onattachhandler1() {//foo }
>    protected void onattachhandler2() {//bar}
> }
>
> annots:
> public class MyComponent extends Component {
> protected void onattachhandler1() {//foo }
>    @OnAttach protected void onattachhandler2() {//bar}
> }
>
> listeners:
> public class MyComponent extends Component {
>    public MyComponent(...) {
>        add(new IAttachListener() { public void onAttach() {
> onattachhandler1(); onattachhandler2(); }}
>    }
>
>    protected void onattachhandler1() {//foo }
>    protected void onattachhandler2() {//bar}
> }
>
> personally i like the current one, its simpler
>
> the thing is that we should factor out all the behavior that needs to be
> overridable out of the onattach() methods, like i did for the listview
just
> now. and yes, if it is not meant to be overridden then use a different
> component.
>
> -igor
>
>
> On 1/4/07, Martijn Dashorst <[EMAIL PROTECTED]> wrote:
> >
> > On 1/4/07, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
> > > ahh, but then you are back to the exact same problem. how do you
> > override
> > > behavior that was added via an anonymous ILifecycleListener (or
whatever
> > you
> > > call it) :) the solution is the same as for the current onattach()
> > problem,
> > > and for annotations approach - behavior that is meant to be
overridable
> > > needs to be factored out into a separate method.
> >
> > Not completely: the problem we are discussing is not methods that need
> > to be overridden, but overridable methods that are implemented, but
> > still need to be called.
> >
> > With the chain (and the annotations) we avoided that particular aspect
> > of the problem.
> >
> > The thing you are talking about is disabling a particular behavior. In
> > that case, I think creating a new component might be a better
> > solution, as you are truly not extending the original design of a
> > component, but tinkering with the intended behavior to which the
> > component was designed.
> >
> > If you still want to re-use that particular component, then the common
> > functionality should be extracted to a base, without the undesired
> > behavior.
> >
> > Currently the problem is not that some feature needs to be disabled,
> > but that some necessary code has to be called for the component to
> > work correctly. Registering the handlers (through annotations or chain
> > of commands) does solve this particular problem without the need for
> > reading and correctly interpreting javadocs.
> >
> > Martijn
> >
> > --
> > Vote for Wicket at the
> > http://www.thebeststuffintheworld.com/vote_for/wicket
> > Wicket 1.2.4 is as easy as 1-2-4. Download Wicket now!
> > http://wicketframework.org
> >
>
>


--
Vote for Wicket at the
http://www.thebeststuffintheworld.com/vote_for/wicket
Wicket 1.2.4 is as easy as 1-2-4. Download Wicket now!
http://wicketframework.org

Reply via email to