Sky is intended to support multiple frameworks. Here is one way you could register a custom element using Dart annotations:
// @tagname annotation for registering elements // only useful when placed on classes that inherit from Element class tagname extends AutomaticMetadata { const tagname(this.name); final String name; void init(DeclarationMirror target, Module module, ScriptElement script) { assert(target is ClassMirror); if (!(target as ClassMirror).isSubclassOf(reflectClass(Element))) throw new UnsupportedError('@tagname can only be used on descendants of Element'); module.registerElement(name, (target as ClassMirror).reflectedType); } }
A framework that used the above code could use the following code to get the tag name of an element:
String getTagName(Element element) { // O(N) in number of annotations on the class // throws a StateError if the class doesn't have an @tagname annotation var tagnameClass = reflectClass(tagname); return (reflectClass(element.runtimeType).metadata.singleWhere((mirror) => mirror.type == tagnameClass).reflectee as tagname).name; }