Hrm, I think I should have explained this better.
Because elements are `upgraded` it means that an <x-foo> can be constructed before it is registered as a custom element. At the exact moment `x-foo` becomes registered, all instances of `x-foo` are magically upgraded to their custom version.
Any `x-foo` constructed after `x-foo` is registered are born already upgraded.
Now, because upgrade happens immediately upon registration, the order of registration is important.
Say 'x-bar' uses 'x-foo'. It's very convenient for 'x-bar' to rely on all 'x-foo' being registered ahead of time. An application can ensure this by executing the `x-foo` registration code before `x-bar`. Usually we ensure this by simply having x-bar depend on x-foo, like so:
<!-- make sure we define x-foo before registering x-bar -->
<link rel="import" href="../x-foo/x-foo.html">
<!-- register x-bar -->
<polymer-element name="x-bar" ...>
...
<x-foo ...>...</x-foo>
...
</polymer-element>
This way we can be sure that x-foo.html is loaded before x-bar is registered. If other elements import x-foo.html, de-duplication makes sure that redundant imports are a safe no-op.
If we forget to do this and allow x-bar to be defined before x-foo, then the x-foo inside of x-bar starts out life as a plain HTMLElement. Plain HTMLElements only do attribute binding, so any bindings on x-foo created by x-bar will only be attribute bindings.
If we make sure x-foo is loaded before x-bar, then when x-bar creates an x-foo, the x-foo is all ready to go and has the necessary information to create proper two-way object bindings.
HTH,
Scott