| Index: packages/initialize/README.md
|
| diff --git a/packages/initialize/README.md b/packages/initialize/README.md
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..32c1f6b66f2eb4d75fc3305b4187f4ca5ea8ef57
|
| --- /dev/null
|
| +++ b/packages/initialize/README.md
|
| @@ -0,0 +1,114 @@
|
| +# Initialize [](https://travis-ci.org/dart-lang/initialize)
|
| +
|
| +This package provides a common interface for initialization annotations on top
|
| +level methods, classes, and libraries. The interface looks like this:
|
| +
|
| +```dart
|
| +abstract class Initializer<T> {
|
| + dynamic initialize(T target);
|
| +}
|
| +```
|
| +
|
| +The `initialize` method will be called once for each annotation. The type `T` is
|
| +determined by what was annotated. For libraries it will be a `LibraryIdentifier`
|
| +representing that library, for a class it will be the `Type` representing that
|
| +class, and for a top level method it will be the `Function` object representing
|
| +that method.
|
| +
|
| +If a future is returned from the initialize method, it will wait until the future
|
| +completes before running the next initializer.
|
| +
|
| +## Usage
|
| +
|
| +### @initMethod
|
| +
|
| +There is one initializer which comes with this package, `@initMethod`. Annotate
|
| +any top level function with this and it will be invoked automatically. For
|
| +example, the program below will print `hello`:
|
| +
|
| +```dart
|
| +import 'package:initialize/initialize.dart';
|
| +
|
| +@initMethod
|
| +printHello() => print('hello');
|
| +
|
| +main() => run();
|
| +```
|
| +
|
| +### Running the initializers
|
| +
|
| +In order to run all the initializers, you need to import
|
| +`package:initialize/initialize.dart` and invoke the `run` method. This should
|
| +typically be the first thing to happen in your main. That method returns a Future,
|
| +so you should put the remainder of your program inside the chained then call.
|
| +
|
| +```dart
|
| +import 'package:initialize/initialize.dart';
|
| +
|
| +main() {
|
| + run().then((_) {
|
| + print('hello world!');
|
| + });
|
| +}
|
| +```
|
| +
|
| +## Transformer
|
| +
|
| +During development a mirror based system is used to find and run the initializers,
|
| +but for deployment there is a transformer which can replace that with a static list
|
| +of initializers to be ran.
|
| +
|
| +This will create a new entry point which bootstraps your existing app, this will
|
| +have the same file name except `.dart` with be replaced with `.initialize.dart`.
|
| +If you supply an html file to `entry_points` then it will bootstrap the dart
|
| +script tag on that page and replace the `src` attribute to with the new
|
| +bootstrap file.
|
| +
|
| +Below is an example pubspec with the transformer:
|
| +
|
| + name: my_app
|
| + dependencies:
|
| + initialize: any
|
| + transformers:
|
| + - initialize:
|
| + entry_points: web/index.html
|
| +
|
| +## Creating your own initializer
|
| +
|
| +Lets look at a slightly simplified version of the `@initMethod` class:
|
| +
|
| +```dart
|
| +class InitMethod implements Initializer<Function> {
|
| + const InitMethod();
|
| +
|
| + @override
|
| + initialize(Function method) => method();
|
| +}
|
| +```
|
| +
|
| +You would now be able to add `@InitMethod()` in front of any function and it
|
| +will be automatically invoked when the user calls `run()`.
|
| +
|
| +For classes which are stateless, you can usually just have a single const
|
| +instance, and that is how the actual InitMethod implementation works. Simply add
|
| +something like the following:
|
| +
|
| +```dart
|
| +const initMethod = const InitMethod();
|
| +```
|
| +
|
| +Now when people use the annotation, it just looks like `@initMethod` without any
|
| +parenthesis, and its a bit more efficient since there is a single instance. You
|
| +can also make your class private to force users into using the static instance.
|
| +
|
| +## Creating custom transformer plugins
|
| +
|
| +It is possible to create a custom plugin for the initialize transformer which
|
| +allows you to have full control over what happens to your annotations at compile
|
| +time. Implement `InitializerPlugin` class and pass that in to the
|
| +`InitializeTransformer` to make it take effect.
|
| +
|
| +You will need to be familiar with the `analyzer` package in order to write these
|
| +plugins, but they can be extremely powerful. See the `DefaultInitializerPlugin`
|
| +in `lib/build/initializer_plugin.dart` as a reference. Chances are you may want
|
| +to extend that class in order to get a lot of the default functionality.
|
|
|