Thoughts with >>>. My mail program did not auto > the previous email :-)

Thanks for responding to this. I'll close this out.

-----Original Message-----
From: Greg Brown [mailto:gkbr...@mac.com] 
Sent: Wednesday, June 23, 2010 2:41 PM
To: dev@pivot.apache.org
Subject: Re: [jira] Resolved: (PIVOT-542) enable the serializer to
initialize components written in java code

> The seriliazer already plays the initialization role. 

The serializer is the creator and the initializer. In the model you suggest,
it is only the initializer - the new keyword is used to create the object.
This is inconsistent. If you only need initialization, you should use the
bind() method.

>>>bind() cannot automatically perform full binding actually on its own
without coding. Coding is not bad, but its not needed here. With the
proposed approach, variables, not just @WTKX variables, including those
defined in superclasses are automatically initialized because the xml is
just the freeze dried version of the object. In fact the Bindable interface
with the initialize method encourages you to reach in and get resources.  A
cleaner approach is that the properties at the root level of the serializer
are really the properties of the object being created.

> My understanding is that skins are views. Components are
model/controllers.
> The view should not be loading user data and other child content into the
> mode/controller so I'm not sure I would agree that the skin should be
doing
> this at all because part of the initialization is also Component data such
> as userData.

Skins shouldn't get involved in the model data, but they are allowed to add
sub-components. For example, all composite component skins do this (Spinner,
ScrollBar, Frame, etc.).

>>>That's a great point.  And in fact, this initialize() proposal does not
change this it all.

> With the editor, there are a few ways to do this. This is actually a very
> direct approach. In the thoughts below, I am still forced, at a minimum,
to
> use an interface and for me to write code for wiring. I'm not against
> writing code but when the serializer can do it naturally, that's a win.

The problem is that the suggested modifications to the serializer are not
natural because they don't fit in with the overall design of the framework.

>>>I think I get your point about skins and I think I appreciate skins more
now than I did before.

>>>But I can see from other recent changes to the Bindable interface that
you are moving closer to this initialize proposal. If you take Bindable to
the next step, you starting getting the initialize approach I am proposing.
Not against Bindable, but its another interface that's not always needed and
bind() cannot automatically initialize all of the object's properties
automatically such as userData or other properties define in your
code-behind. The serializer is actually inconsistent in its ability to
initialize instance variables of the calling object when you call bind().
Bind() can only do @WTKX variables, but a component has a lot of variables
in superclasses that could use similar help.

>>>Lets say you remove the Bindable interface because you don't want
component writers to have to worry about another interface and their methods
for initialization. What would you do? The initialize() proposal is an
answer and it does more initialization of variables since bind() only does
@WTKX annotated variables. The semantics of Bindable combines two logical
elements into one: some bind() which is instance variable initialization and
notifying the object it has been bound (that it has been initialized through
binding). @WTKX still stays because it initializes variables only in your
subclass without any extra work, a huge convenience.

>>Notifying that a bind has occurred is actually closer to @PostConstruct
which is a java standard. It is called after instantiation and automatic
variable initialization. But in pivot Bindable tries to do both. It combines
two things into one. Teasing this apart slightly with this proposal around
initialization semantics actually improves consistency of instance variable
initialization and provides a new capability for clients. You can't annotate
instance variables in superclasses without access to source code, but you
still want them initialized from the serializer just like @WTKX variables in
your subclass. It's a big convenience.

>>>Example: Think about the MyDialog just posted to the user list. In it,
you define a subclass of Dialog. But to allow them to use it they have to
use an include in the bxml because the "contents" of the dialog are in the
bxml. I say skip the include. When you need to use the MyDialog in code or
bxml, just refer to the class as you would any other pivot-provided
component. The bxml just backs the object being created. In this case, there
is total consistency between code and bxml in terms of using MyDialog
regardless of how its deployed by the client. The MyDialog.bxml would be
used behind the scenes, using this proposal, to initialize the object
whether the client created it in code or bxml. Of course, MyDialog could be
coded other ways, such as creating a skin. But for this, would do really go
through that effort?


> It took me awhile to understand why I
> had to always had to do extra work with includes or setting left and right
> children in code until I realized that the serializer should be doing it
for
> me.

Again, in frameworks that compile to classes, this makes sense. When I
define MyClass.xaml and MyClass.cs, they are both combined such that the
following both instantiates and initializes the class:

  MyClass myClass = new MyClass();

But this doesn't work for BXMLSerializer.

>>> I am not totally familiar with the blending you describe but I don't
think that object instantiation and initialization are directly tied to
blending. I am not claiming that "you" create the element directly, just
that the bxml file holds parts of the freeze dried version of the object
whether you create the root object in code or bxml. In xaml, I don't think
there are there are any "do an include to include your object" and you
should not have to (but its an option), in pivot.

Reply via email to