diff --git a/specs/elements.md b/specs/elements.md index 07b3633a16c..f219ad0d4c7 100644 --- a/specs/elements.md +++ b/specs/elements.md @@ -184,19 +184,6 @@ class Attr { final String value; // O(1) } -// @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) { - 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); - } -} - // @hasShadow annotation for registering elements class _HasShadow { const _HasShadow(); @@ -222,12 +209,6 @@ abstract class Element extends ParentNode { // children must be Text or Element // if needsShadow is true, creates a shadow tree - String get tagName { // 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(this.runtimeType).metadata.singleWhere((mirror) => mirror.type == tagnameClass).reflectee as tagname).name; - } - external bool hasAttribute(String name); // O(N) in number of attributes external String getAttribute(String name); // O(N) in number of attributes external void setAttribute(String name, [String value = '']); // O(N) in number of attributes diff --git a/specs/frameworks.md b/specs/frameworks.md new file mode 100644 index 00000000000..f7d91a517f6 --- /dev/null +++ b/specs/frameworks.md @@ -0,0 +1,31 @@ +Frameworks +---------- + +Sky is intended to support multiple frameworks. Here is one way you +could register a custom element using Dart annotations: + +```dart +// @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: + +```dart +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; +} +``` diff --git a/specs/modules.md b/specs/modules.md index 25f8e62d034..475ef9461a6 100644 --- a/specs/modules.md +++ b/specs/modules.md @@ -71,15 +71,17 @@ the library itself): ```dart class _ { } -void main() { +void main(ScriptElement script) { LibraryMirror library = reflectClass(_).owner as LibraryMirror; - if (library.declarations.containsKey(#init) && library.declarations[#init] is MethodMirror) - init(); - AutomaticMetadata.runLibrary(library, module); + if (library.declarations.containsKey(#_init) && library.declarations[#_init] is MethodMirror) + _init(script); + AutomaticMetadata.runLibrary(library, module, script); } ``` -Then, that ``main()`` function is called. +Then, that ``main(script)`` function is called, with ``script`` set to +the ``ScriptElement`` object representing the relevant ``