[Seaside] dynamic subcomponents proposal

Avi Bryant avi@beta4.com
Sat, 15 Jun 2002 18:58:50 -0700 (PDT)


Actually this affects subcomponents pretty generally, but it's motivated
by Tim's (and others) request for subcomponents with dynamic class.  What
I'm currently thinking about doing is this:

- rather than configuring subcomponents in an #addHandlers (or
#addBindingsTo:) method, each subcomponent will have a creation method in
its parent.  These will follow some sort of naming convention, ie, the
subcomponent named 'questionPane' would be created by
#subcomponentQuestionPane.  The responsibility of this method is to
create, configure, and return a subcomponent.  For example, it might look
like

subcomponentQuestionPane
  ^ QuestionComponent new
      message: 'Answer the following question:'
      onDisplay: [:q | q question: self question]
      onUpdate: [:q | answer := q answer]

- if the creation method takes 0 arguments, it is called only once in a
component's lifetime

- if the creation method takes 1 argument, it is called for every display
of the subcomponent, and is passed the current instance of that
subcomponent.  The method can choose to return either the existing
subcomponent or a new one.  For example,

subcomponentQuestionPane: current
  ^ current class = self question componentClass
      ifTrue: [current]
      ifFalse:
       [self question componentClass new
           ...]

Comments:
 - are those rules too implicit?  Is there a better way to do it (split it
into two methods, one to decide whether to create and one to create)?

 - this draws a very strong line between simple template elements (ie,
checkboxes) and full subcomponents.  I used to think that was a bad idea,
but it's bothering me less these days.

What do y'all think?

Avi