SKY MODULE - defines an <element> element
<import src="sky:core" as="sky"/>

<!-- usage:

   <element name="tagname">
    <style> style here (optional) </style>
    <template> shadow tree here (optional) </template>
    <script> // optional
     module.currentScript.parentNode.setPrototype({
       init: function () {
         // constructor here
       },
       // rest of api here
     });
    </script>
   </element>

-->

<script>
 module.exports.Element = sky.registerElement(
   class extends Element {
     static get tagName() { return 'element'; }
     constructor (hostModule) {
       super(hostModule);
       this.state = 'loading';
       this.module = hostModule;
       this.definedPrototype = sky.Element;
     }
     setPrototype(prototype) {
       this.definedPrototype = prototype;
     }
     endTagParsedCallback() {
       let style = null;
       let template = null;
       let child = this.firstChild;
       while (child && !(style && template)) {
         if ((!style) && (child instanceof sky.StyleElement))
           style = child;
         if ((!template) && (template instanceof sky.TemplateElement))
           template = child;
         child = child.nextSibling;
       }
       let tagName = this.getAttribute('name');
       let constructorName = tagName.charAt(0).toUpperCase() + tagName.slice(1) + 'Element';
       let constructor = function (hostModule) {
         super(hostModule);
         if (this.init)
           this.init();
         if (style)
           this.shadowRoot.append(style.cloneNode(true));
         if (template)
           this.shadowRoot.append(template.cloneNode(true));
         }
       };
       if (this.definedPrototype)
         constructor.prototype = this.definedPrototype;
       else
         constructor.prototype = sky.Element;
       constructor.tagName = this.getAttribute('name');
       constructor.shadow = style || template;
       this.module.exports[constructorName] = this.registerElement(constructor);
       delete this.definedPrototype;
       delete this.module;
       this.state = 'loaded';
     }
   }
 );
</script>
