| Index: sky/specs/frameworks.md
|
| diff --git a/sky/specs/frameworks.md b/sky/specs/frameworks.md
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f7d91a517f6f7347e3687548a8bd79b832b43853
|
| --- /dev/null
|
| +++ b/sky/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;
|
| +}
|
| +```
|
|
|