diff --git a/.eslintrc.json b/.eslintrc.json
index 824eb0a..d546220 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -3,7 +3,14 @@
     "rules": {
       "no-underscore-dangle": "off",
       "no-restricted-syntax": "off",
-      "no-unused-expressions": "off"
+      "no-unused-expressions": "off",
+      "comma-dangle": ["error", {
+          "arrays": "always-multiline",
+          "objects": "always-multiline",
+          "imports": "always-multiline",
+          "exports": "always-multiline",
+          "functions": "never"
+      }]
     },
     "globals": {
       "context": true,
diff --git a/README.md b/README.md
index 1b05046..9283d39 100644
--- a/README.md
+++ b/README.md
@@ -71,7 +71,7 @@ const props = new Properties({
 const pipeline = new Pipeline(props, 'English', connector);
 ```
 
-### 4. Use it
+### 4. Usage
 
 ```javascript
 // ... initialize pipeline first (see above)
@@ -112,7 +112,1436 @@ pipeline.annotate(sent)
   });
 ```
 
-## Documentation
+# API Reference
+## Functions
+
+<dl>
+<dt><a href="#setProperty">setProperty(name, value)</a></dt>
+<dd><p>Property setter</p>
+</dd>
+<dt><a href="#getProperty">getProperty(name, default)</a> ⇒ <code>*</code></dt>
+<dd><p>Property getter</p>
+</dd>
+<dt><a href="#getProperties">getProperties()</a> ⇒ <code>Object</code></dt>
+<dd><p>Returns an Object map of the given properties</p>
+</dd>
+<dt><a href="#toJson">toJson()</a> ⇒ <code>Object</code></dt>
+<dd><p>Returns a JSON object of the given properties</p>
+</dd>
+<dt><a href="#toPropertiessFileContent">toPropertiessFileContent()</a> ⇒ <code>string</code></dt>
+<dd><p>Returns a properties file-like string of the given properties</p>
+</dd>
+<dt><a href="#get">get()</a> ⇒ <code>Promise.&lt;Object&gt;</code></dt>
+<dd></dd>
+<dt><a href="#get">get(config, [utility])</a> ⇒ <code>Promise.&lt;Object&gt;</code></dt>
+<dd></dd>
+<dt><a href="#text">text()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation of the raw text</p>
+</dd>
+<dt><a href="#setLanguageISO">setLanguageISO()</a> ⇒ <code>string</code></dt>
+<dd><p>Sets the language ISO (given by the pipeline during the annotation process)
+This is solely to keep track of the language chosen for further analysis</p>
+</dd>
+<dt><a href="#getLanguageISO">getLanguageISO()</a> ⇒ <code>string</code></dt>
+<dd><p>Retrieves the language ISO</p>
+</dd>
+<dt><a href="#addAnnotator">addAnnotator(annotator)</a></dt>
+<dd><p>Marks an annotator as a met dependency</p>
+</dd>
+<dt><a href="#addAnnotators">addAnnotators(annotators)</a></dt>
+<dd><p>Marks multiple annotators as a met dependencies</p>
+</dd>
+<dt><a href="#removeAnnotator">removeAnnotator(annotator)</a></dt>
+<dd><p>Unmarks an annotator as a met dependency</p>
+</dd>
+<dt><a href="#hasAnnotator">hasAnnotator(annotator)</a> ⇒ <code>boolean</code></dt>
+<dd><p>Tells you if an annotator is a met dependency</p>
+</dd>
+<dt><a href="#hasAnyAnnotator">hasAnyAnnotator(annotators)</a> ⇒ <code>boolean</code></dt>
+<dd><p>Tells you if at least on of a list of annotators is a met dependency</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#equalsTo">equalsTo(annotator)</a> ⇒ <code>boolean</code></dt>
+<dd><p>Defines whether a given annotator is the same as current, using shallow compare.
+This is useful for a Document or Sentence to validate if the minimum of annotators required
+were already applied to them.  Allows at the same time the users to instantiate new annotators
+and configure them as needed.</p>
+</dd>
+<dt><a href="#options">options()</a> ⇒ <code>Object</code></dt>
+<dd><p>Get an Object key-value representation of the annotor&#39;s options (excluding prefix)</p>
+</dd>
+<dt><a href="#option">option(key, [value])</a> ⇒ <code>string</code></dt>
+<dd><p>Get/Set an option value</p>
+</dd>
+<dt><a href="#dependencies">dependencies()</a> ⇒ <code>Array.&lt;Annotator&gt;</code></dt>
+<dd><p>Get a list of annotators dependencies</p>
+</dd>
+<dt><a href="#pipeline">pipeline()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get a list of annotators dependencies, following by this annotator, all this as
+a list of strings
+This is useful to fulfill the <code>annotators</code> param in CoreNLP API properties.</p>
+</dd>
+<dt><a href="#pipelineOptions">pipelineOptions()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get an object of all the Annotator options including the current and all its 
+dependencies, prefixed by the annotator names
+This is useful to fulfill the options params in CoreNLP API properties.</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#sentences">sentences()</a> ⇒ <code>Array.&lt;Sentence&gt;</code></dt>
+<dd><p>Get a list of sentences</p>
+</dd>
+<dt><a href="#sentence">sentence(index)</a> ⇒ <code>Sentence</code></dt>
+<dd><p>Get the sentence for a given index</p>
+</dd>
+<dt><a href="#coref">coref()</a> ⇒ <code>Promise.&lt;DeterministicCorefAnnotator&gt;</code></dt>
+<dd><p>TODO
+requirements: tokenize, ssplit, pos, lemma, ner, parse
+<a href="https://stanfordnlp.github.io/CoreNLP/dcoref.html">https://stanfordnlp.github.io/CoreNLP/dcoref.html</a></p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data)</a> ⇒ <code>Document</code></dt>
+<dd><p>Update an instance of Document with data provided by a JSON</p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data)</a> ⇒ <code>Document</code></dt>
+<dd><p>Get an instance of Document from a given JSON</p>
+</dd>
+<dt><a href="#groups">groups()</a> ⇒ <code><a href="#ExpressionSentenceMatchGroup">Array.&lt;ExpressionSentenceMatchGroup&gt;</a></code></dt>
+<dd><p>Returns the main and labeled groups as a list of ExpressionSentenceMatchGroup</p>
+</dd>
+<dt><a href="#group">group(label)</a> ⇒ <code><a href="#ExpressionSentenceMatchGroup">ExpressionSentenceMatchGroup</a></code></dt>
+<dd><p>Nodes in a Macthed expression can be named, we call them groups here, and
+the labels are the name of the nodes.</p>
+</dd>
+<dt><a href="#labels">labels()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Labels are those aliases you can add to a group match expression, for example,
+in Semgrex, you can do {ner:/PERSON/=good_guy}, from where &quot;good_guy&quot; would be the label
+and internally it will come as $good_guy as a member of <a href="#ExpressionSentenceMatchGroup">ExpressionSentenceMatchGroup</a>.</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>ExpressionSentenceMatch</code></dt>
+<dd><p>Update an instance of ExpressionSentenceMatch with data provided by a JSON</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>ExpressionSentenceMatch</code></dt>
+<dd><p>Get an instance of ExpressionSentenceMatch from a given JSON</p>
+</dd>
+<dt><a href="#matches">matches()</a> ⇒ <code>Array.&lt;ExpressionSentenceMatch&gt;</code></dt>
+<dd><p>Retrieves all the contained ExpressionSentenceMatch instances</p>
+</dd>
+<dt><a href="#match">match(index)</a> ⇒ <code>ExpressionSentenceMatch</code></dt>
+<dd><p>Retrieves a ExpressionSentenceMatch at the index specified</p>
+</dd>
+<dt><a href="#mergeTokensFromSentence">mergeTokensFromSentence()</a> ⇒ <code>ExpressionSentence</code></dt>
+<dd><p>The Expression / ExpressionSentence objects comes from outside the standard CoreNLP pipelines.
+This mean that neither <code>TokensRegex</code>, <code>Semgrex</code> nor <code>Tregex</code> will tag the nodes with POS,
+lemma, NER or any otehr annotation data.  This is sometimes a usful resource to count with, if
+you can apart of getting the matching groups, get the annotated tokens for each word in the
+match group.</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>ExpressionSentenceJSON</code></dt>
+<dd><p>Update an instance of ExpressionSentence with data provided by a JSON</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>ExpressionSentence</code></dt>
+<dd><p>Get an instance of ExpressionSentence from a given JSON of sentence matches</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#pattern">pattern()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the pattern</p>
+</dd>
+<dt><a href="#sentences">sentences()</a> ⇒ <code>Array.&lt;ExpressionSentence&gt;</code></dt>
+<dd><p>Get a list of sentences</p>
+</dd>
+<dt><a href="#sentence">sentence(index)</a> ⇒ <code>ExpressionSentence</code></dt>
+<dd><p>Get the sentence for a given index</p>
+</dd>
+<dt><a href="#mergeTokensFromDocument">mergeTokensFromDocument(document)</a> ⇒ <code>Expression</code></dt>
+<dd><p>Hydrate the Expression instance with Token objects from an annotated Document</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>Expression</code></dt>
+<dd><p>Update an instance of Expression with data provided by a JSON</p>
+</dd>
+<dt><a href="#fromJson">fromJson(data)</a> ⇒ <code>Expression</code></dt>
+<dd><p>Get an instance of Expression from a given JSON</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data)</a> ⇒ <code>Governor</code></dt>
+<dd><p>Get an instance of Governor from a given JSON</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#index">index()</a> ⇒ <code>number</code></dt>
+<dd><p>Get the index relative to the parent document</p>
+</dd>
+<dt><a href="#parse">parse()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation of the parse tree structure</p>
+</dd>
+<dt><a href="#words">words()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get an array of string representations of the sentence words</p>
+</dd>
+<dt><a href="#word">word(index)</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representations of the Nth word of the sentence</p>
+</dd>
+<dt><a href="#posTags">posTags()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get a string representations of the tokens part of speech of the sentence</p>
+</dd>
+<dt><a href="#posTag">posTag(index)</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representations of the Nth token part of speech of the sentence</p>
+</dd>
+<dt><a href="#lemmas">lemmas()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get a string representations of the tokens lemmas of the sentence</p>
+</dd>
+<dt><a href="#lemma">lemma(index)</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representations of the Nth token lemma of the sentence</p>
+</dd>
+<dt><a href="#nerTags">nerTags()</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
+<dd><p>Get a string representations of the tokens nerTags of the sentence</p>
+</dd>
+<dt><a href="#nerTag">nerTag(index)</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representations of the Nth token nerTag of the sentence</p>
+</dd>
+<dt><a href="#governors">governors()</a> ⇒ <code>Array.&lt;Governor&gt;</code></dt>
+<dd><p>Get a list of annotated governors by the dependency-parser</p>
+</dd>
+<dt><a href="#governor">governor()</a> ⇒ <code>Governor</code></dt>
+<dd><p>Get the N-th annotated governor by the dependency-parser annotator</p>
+</dd>
+<dt><a href="#tokens">tokens()</a> ⇒ <code>Array.&lt;Token&gt;</code></dt>
+<dd><p>Get an array of token representations of the sentence words</p>
+</dd>
+<dt><a href="#token">token()</a> ⇒ <code>Token</code></dt>
+<dd><p>Get the Nth token of the sentence</p>
+</dd>
+<dt><a href="#toJSON">toJSON()</a> ⇒ <code><a href="#SentenceJSON">SentenceJSON</a></code></dt>
+<dd><p>The following arrow function <code>data =&gt; Sentence.fromJSON(data).toJSON()</code> is idempontent, if
+considering shallow comparison, not by reference.
+This JSON will respects the same structure as it expects from {@see Sentence#fromJSON}.</p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data, [isSentence])</a> ⇒ <code>Sentence</code></dt>
+<dd><p>Update an instance of Sentence with data provided by a JSON</p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data, [isSentence])</a> ⇒ <code>Sentence</code></dt>
+<dd><p>Get an instance of Sentence from a given JSON</p>
+</dd>
+<dt><a href="#toString">toString()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a string representation</p>
+</dd>
+<dt><a href="#index">index()</a> ⇒ <code>number</code></dt>
+<dd><p>Get the <code>inde</code> number associated by the StanfordCoreNLP
+This index is relative to the sentence it belongs to, and is a 1-based (possitive integer).
+This number is useful to match tokens within a sentence for depparse, coreference, etc.</p>
+</dd>
+<dt><a href="#word">word()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the original word</p>
+</dd>
+<dt><a href="#originalText">originalText()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the original text</p>
+</dd>
+<dt><a href="#characterOffsetBegin">characterOffsetBegin()</a> ⇒ <code>number</code></dt>
+<dd><p>A 0-based index of the word&#39;s initial character within the sentence</p>
+</dd>
+<dt><a href="#characterOffsetEnd">characterOffsetEnd()</a> ⇒ <code>number</code></dt>
+<dd><p>Get the characterOffsetEnd relative to the parent sentence
+A 0-based index of the word&#39;s ending character within the sentence</p>
+</dd>
+<dt><a href="#before">before()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the <code>before</code> string relative to the container sentence</p>
+</dd>
+<dt><a href="#after">after()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the <code>after</code> string relative to the container sentence</p>
+</dd>
+<dt><a href="#lemma">lemma()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the annotated lemma</p>
+</dd>
+<dt><a href="#pos">pos()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the annotated part-of-speech for the current token</p>
+</dd>
+<dt><a href="#posInfo">posInfo()</a> ⇒ <code><a href="#PosInfo">PosInfo</a></code></dt>
+<dd><p>Get additional metadata about the POS annotation
+NOTE: Do not use this method other than just for study or analysis purposes.</p>
+</dd>
+<dt><a href="#ner">ner()</a> ⇒ <code>string</code></dt>
+<dd><p>Get the annotated named-entity for the current token</p>
+</dd>
+<dt><a href="#toJSON">toJSON()</a> ⇒ <code><a href="#TokenJSON">TokenJSON</a></code></dt>
+<dd><p>The following arrow function <code>data =&gt; Token.fromJSON(data).toJSON()</code> is idempontent, if
+considering shallow comparison, not by reference.
+This JSON will respects the same structure as it expects from {@see Token#fromJSON}.</p>
+</dd>
+<dt><a href="#fromJSON">fromJSON(data)</a> ⇒ <code>Token</code></dt>
+<dd><p>Get an instance of Token from a given JSON</p>
+</dd>
+<dt><a href="#dump">dump()</a> ⇒ <code>string</code></dt>
+<dd><p>Get a Tree string representation for debugging purposes</p>
+</dd>
+<dt><a href="#visitDeepFirst">visitDeepFirst()</a></dt>
+<dd><p>Performs Deep-first Search calling a visitor for each node</p>
+</dd>
+<dt><a href="#visitDeepFirstRight">visitDeepFirstRight()</a></dt>
+<dd><p>Performs Deep-first Search calling a visitor for each node, from right to left</p>
+</dd>
+<dt><a href="#visitLeaves">visitLeaves()</a></dt>
+<dd><p>Performs Deep-first Search calling a visitor only over leaves</p>
+</dd>
+<dt><a href="#fromSentence">fromSentence(sentence, [doubleLink])</a> ⇒ <code>Tree</code></dt>
+<dd></dd>
+<dt><a href="#fromString">fromString(str, [doubleLink])</a> ⇒ <code>Tree</code></dt>
+<dd></dd>
+</dl>
+
+## Typedefs
+
+<dl>
+<dt><a href="#DocumentJSON">DocumentJSON</a></dt>
+<dd><p>The CoreNLP API JSON structure representing a document</p>
+</dd>
+<dt><a href="#ExpressionSentenceMatchGroup">ExpressionSentenceMatchGroup</a></dt>
+<dd></dd>
+<dt><a href="#ExpressionSentenceMatchJSON">ExpressionSentenceMatchJSON</a></dt>
+<dd><p>A ExpressionSentenceMatch of either <code>TokensRegex</code>, <code>Semrgex</code> or <code>Tregex</code>.</p>
+</dd>
+<dt><a href="#ExpressionJSON">ExpressionJSON</a></dt>
+<dd><p>The CoreNLP API JSON structure representing an expression
+This expression structure can be found as the output of <code>TokensRegex</code>,
+<code>Semrgex</code> and <code>Tregex</code>.</p>
+</dd>
+<dt><a href="#GovernorJSON">GovernorJSON</a></dt>
+<dd><p>The CoreNLP API JSON structure representing a governor</p>
+</dd>
+<dt><a href="#SentenceJSON">SentenceJSON</a></dt>
+<dd><p>The CoreNLP API JSON structure representing a sentence</p>
+</dd>
+<dt><a href="#TokenJSON">TokenJSON</a></dt>
+<dd><p>The CoreNLP API JSON structure representing a token</p>
+</dd>
+<dt><a href="#PosInfo">PosInfo</a></dt>
+<dd><p>PosInfo does not come as part of the CoreNLP.  It is an indexed reference of POS tags
+by language provided by this library.  It&#39;s only helpful for analysis and study.  The
+data was collected from different documentation resources on the Web.
+The PosInfo may vary depending on the POS annotation types used, for example, CoreNLP
+for Spanish uses custom POS tags developed by Stanford, but this can also be changed 
+to Universal Dependencies, which uses different tags.</p>
+</dd>
+</dl>
+
+## External
+
+<dl>
+<dt><a href="#DeterministicCorefAnnotator
+TODO ??external_">DeterministicCorefAnnotator
+TODO ??</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an DeterministicCorefAnnotator.</p>
+</dd>
+<dt><a href="#DependencyParseAnnotator
+Hydrates {@link Sentence.governors_new}external_">DependencyParseAnnotator
+Hydrates {@link Sentence.governors()}</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an DependencyParseAnnotator.</p>
+</dd>
+<dt><a href="#MorphaAnnotator
+Hydrates {@link Token.lemma_new}external_">MorphaAnnotator
+Hydrates {@link Token.lemma()}</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an MorphaAnnotator.</p>
+</dd>
+<dt><a href="#NERClassifierCombiner
+Hydrates {@link Token.ner_new}external_">NERClassifierCombiner
+Hydrates {@link Token.ner()}</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an NERClassifierCombiner.</p>
+</dd>
+<dt><a href="#ParserAnnotator
+Hydrates {@link Token.parse_new}external_">ParserAnnotator
+Hydrates {@link Token.parse()}</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an ParserAnnotator.</p>
+</dd>
+<dt><a href="#POSTaggerAnnotator
+Hydrates {@link Token.pos_new}external_">POSTaggerAnnotator
+Hydrates {@link Token.pos()}</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an POSTaggerAnnotator.</p>
+</dd>
+<dt><a href="#RegexNERAnnotator
+TODO ??external_">RegexNERAnnotator
+TODO ??</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an RegexNERAnnotator.</p>
+</dd>
+<dt><a href="#RelationExtractorAnnotator
+TODO ??external_">RelationExtractorAnnotator
+TODO ??</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an RelationExtractorAnnotator.</p>
+</dd>
+<dt><a href="#WordsToSentenceAnnotator
+Combines multiple {@link Token}s into sentencesexternal_">WordsToSentenceAnnotator
+Combines multiple {@link Token}s into sentences</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an WordsToSentenceAnnotator.</p>
+</dd>
+<dt><a href="#TokenizerAnnotator
+Identifies {@link Token}sexternal_">TokenizerAnnotator
+Identifies {@link Token}s</a> ⇐ <code>Annotator</code></dt>
+<dd><p>Class representing an TokenizerAnnotator.</p>
+</dd>
+</dl>
+
+<a name="setProperty"></a>
+
+## setProperty(name, value)
+Property setter
+
+**Kind**: global function  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| name | <code>string</code> | the property name |
+| value | <code>\*</code> | the property value |
+
+<a name="getProperty"></a>
+
+## getProperty(name, default) ⇒ <code>\*</code>
+Property getter
+
+**Kind**: global function  
+**Returns**: <code>\*</code> - value - the property value  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| name | <code>string</code> | the property name |
+| default | <code>\*</code> | the defaut value to return if not set |
+
+<a name="getProperties"></a>
+
+## getProperties() ⇒ <code>Object</code>
+Returns an Object map of the given properties
+
+**Kind**: global function  
+**Returns**: <code>Object</code> - properties - the properties object  
+<a name="toJson"></a>
+
+## toJson() ⇒ <code>Object</code>
+Returns a JSON object of the given properties
+
+**Kind**: global function  
+**Returns**: <code>Object</code> - json - the properties object  
+<a name="toPropertiessFileContent"></a>
+
+## toPropertiessFileContent() ⇒ <code>string</code>
+Returns a properties file-like string of the given properties
+
+**Kind**: global function  
+**Returns**: <code>string</code> - properties - the properties content  
+<a name="get"></a>
+
+## get() ⇒ <code>Promise.&lt;Object&gt;</code>
+**Kind**: global function  
+<a name="get"></a>
+
+## get(config, [utility]) ⇒ <code>Promise.&lt;Object&gt;</code>
+**Kind**: global function  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| config | <code>Object</code> |  |
+| config.annotators | <code>Array.&lt;string&gt;</code> | The list of annotators that edfines the pipeline |
+| config.text | <code>string</code> | The text to run the pipeline against |
+| config.options | <code>Object</code> | Additinal options (properties) for the pipeline |
+| config.language | <code>string</code> | Language full name in CamelCase (eg. Spanish) |
+| [utility] | <code>&#x27;&#x27;</code> &#124; <code>&#x27;tokensregex&#x27;</code> &#124; <code>&#x27;semgrex&#x27;</code> &#124; <code>&#x27;tregex&#x27;</code> | Name of the utility to use NOTE: most of the utilities receives properties, these should be passed via the options param |
+
+<a name="text"></a>
+
+## text() ⇒ <code>string</code>
+Get a string representation of the raw text
+
+**Kind**: global function  
+**Returns**: <code>string</code> - text  
+<a name="setLanguageISO"></a>
+
+## setLanguageISO() ⇒ <code>string</code>
+Sets the language ISO (given by the pipeline during the annotation process)
+This is solely to keep track of the language chosen for further analysis
+
+**Kind**: global function  
+**Returns**: <code>string</code> - text  
+<a name="getLanguageISO"></a>
+
+## getLanguageISO() ⇒ <code>string</code>
+Retrieves the language ISO
+
+**Kind**: global function  
+**Returns**: <code>string</code> - text  
+<a name="addAnnotator"></a>
+
+## addAnnotator(annotator)
+Marks an annotator as a met dependency
+
+**Kind**: global function  
+
+| Param | Type |
+| --- | --- |
+| annotator | <code>Annotator</code> &#124; <code>function</code> | 
+
+<a name="addAnnotators"></a>
+
+## addAnnotators(annotators)
+Marks multiple annotators as a met dependencies
+
+**Kind**: global function  
+
+| Param | Type |
+| --- | --- |
+| annotators | <code>Array.&lt;(Annotator\|function())&gt;</code> | 
+
+<a name="removeAnnotator"></a>
+
+## removeAnnotator(annotator)
+Unmarks an annotator as a met dependency
+
+**Kind**: global function  
+
+| Param | Type |
+| --- | --- |
+| annotator | <code>Annotator</code> &#124; <code>function</code> | 
+
+<a name="hasAnnotator"></a>
+
+## hasAnnotator(annotator) ⇒ <code>boolean</code>
+Tells you if an annotator is a met dependency
+
+**Kind**: global function  
+**Returns**: <code>boolean</code> - hasAnnotator  
+
+| Param | Type |
+| --- | --- |
+| annotator | <code>Annotator</code> &#124; <code>function</code> | 
+
+<a name="hasAnyAnnotator"></a>
+
+## hasAnyAnnotator(annotators) ⇒ <code>boolean</code>
+Tells you if at least on of a list of annotators is a met dependency
+
+**Kind**: global function  
+**Returns**: <code>boolean</code> - hasAnyAnnotator  
+
+| Param | Type |
+| --- | --- |
+| annotators | <code>Array.&lt;(Annotator\|function())&gt;</code> | 
+
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - annotator  
+<a name="equalsTo"></a>
+
+## equalsTo(annotator) ⇒ <code>boolean</code>
+Defines whether a given annotator is the same as current, using shallow compare.
+This is useful for a Document or Sentence to validate if the minimum of annotators required
+were already applied to them.  Allows at the same time the users to instantiate new annotators
+and configure them as needed.
+
+**Kind**: global function  
+
+| Param | Type |
+| --- | --- |
+| annotator | <code>Annotator</code> | 
+
+<a name="options"></a>
+
+## options() ⇒ <code>Object</code>
+Get an Object key-value representation of the annotor's options (excluding prefix)
+
+**Kind**: global function  
+**Returns**: <code>Object</code> - options  
+<a name="option"></a>
+
+## option(key, [value]) ⇒ <code>string</code>
+Get/Set an option value
+
+**Kind**: global function  
+**Returns**: <code>string</code> - value  
+
+| Param | Type | Default |
+| --- | --- | --- |
+| key | <code>string</code> |  | 
+| [value] | <code>string</code> &#124; <code>boolean</code> | <code>null</code> | 
+
+<a name="dependencies"></a>
+
+## dependencies() ⇒ <code>Array.&lt;Annotator&gt;</code>
+Get a list of annotators dependencies
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;Annotator&gt;</code> - dependencies  
+<a name="pipeline"></a>
+
+## pipeline() ⇒ <code>Array.&lt;string&gt;</code>
+Get a list of annotators dependencies, following by this annotator, all this as
+a list of strings
+This is useful to fulfill the `annotators` param in CoreNLP API properties.
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - pipeline  
+<a name="pipelineOptions"></a>
+
+## pipelineOptions() ⇒ <code>Array.&lt;string&gt;</code>
+Get an object of all the Annotator options including the current and all its 
+dependencies, prefixed by the annotator names
+This is useful to fulfill the options params in CoreNLP API properties.
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - pipelineOptions  
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - document  
+<a name="sentences"></a>
+
+## sentences() ⇒ <code>Array.&lt;Sentence&gt;</code>
+Get a list of sentences
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;Sentence&gt;</code> - sentences - The document sentences  
+<a name="sentence"></a>
+
+## sentence(index) ⇒ <code>Sentence</code>
+Get the sentence for a given index
+
+**Kind**: global function  
+**Returns**: <code>Sentence</code> - sentence - The document sentences  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | The position of the sentence to get |
+
+<a name="coref"></a>
+
+## coref() ⇒ <code>Promise.&lt;DeterministicCorefAnnotator&gt;</code>
+TODO
+requirements: tokenize, ssplit, pos, lemma, ner, parse
+https://stanfordnlp.github.io/CoreNLP/dcoref.html
+
+**Kind**: global function  
+**Returns**: <code>Promise.&lt;DeterministicCorefAnnotator&gt;</code> - dcoref  
+<a name="fromJSON"></a>
+
+## fromJSON(data) ⇒ <code>Document</code>
+Update an instance of Document with data provided by a JSON
+
+**Kind**: global function  
+**Returns**: <code>Document</code> - document - The current document instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[DocumentJSON](#DocumentJSON)</code> | The document data, as returned by CoreNLP API service |
+
+<a name="fromJSON"></a>
+
+## fromJSON(data) ⇒ <code>Document</code>
+Get an instance of Document from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>Document</code> - document - A new Document instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[DocumentJSON](#DocumentJSON)</code> | The document data, as returned by CoreNLP API service |
+
+<a name="groups"></a>
+
+## groups() ⇒ <code>[Array.&lt;ExpressionSentenceMatchGroup&gt;](#ExpressionSentenceMatchGroup)</code>
+Returns the main and labeled groups as a list of ExpressionSentenceMatchGroup
+
+**Kind**: global function  
+**Returns**: <code>[Array.&lt;ExpressionSentenceMatchGroup&gt;](#ExpressionSentenceMatchGroup)</code> - groups  
+<a name="group"></a>
+
+## group(label) ⇒ <code>[ExpressionSentenceMatchGroup](#ExpressionSentenceMatchGroup)</code>
+Nodes in a Macthed expression can be named, we call them groups here, and
+the labels are the name of the nodes.
+
+**Kind**: global function  
+**Returns**: <code>[ExpressionSentenceMatchGroup](#ExpressionSentenceMatchGroup)</code> - group  
+**See**: [https://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/semgrex/SemgrexPattern.html#Naming_nodes](https://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/semgrex/SemgrexPattern.html#Naming_nodes)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| label | <code>string</code> | The label name, not prefixed wih $ |
+
+<a name="labels"></a>
+
+## labels() ⇒ <code>Array.&lt;string&gt;</code>
+Labels are those aliases you can add to a group match expression, for example,
+in Semgrex, you can do {ner:/PERSON/=good_guy}, from where "good_guy" would be the label
+and internally it will come as $good_guy as a member of [ExpressionSentenceMatchGroup](#ExpressionSentenceMatchGroup).
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - labels  
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>ExpressionSentenceMatch</code>
+Update an instance of ExpressionSentenceMatch with data provided by a JSON
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentenceMatch</code> - expression - The current match instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[ExpressionSentenceMatchJSON](#ExpressionSentenceMatchJSON)</code> | The match data, as returned by CoreNLP API service |
+
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>ExpressionSentenceMatch</code>
+Get an instance of ExpressionSentenceMatch from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentenceMatch</code> - match - A new ExpressionSentenceMatch instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[ExpressionSentenceMatchJSON](#ExpressionSentenceMatchJSON)</code> | The match data, as returned by CoreNLP API service |
+
+<a name="matches"></a>
+
+## matches() ⇒ <code>Array.&lt;ExpressionSentenceMatch&gt;</code>
+Retrieves all the contained ExpressionSentenceMatch instances
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;ExpressionSentenceMatch&gt;</code> - matches  
+<a name="match"></a>
+
+## match(index) ⇒ <code>ExpressionSentenceMatch</code>
+Retrieves a ExpressionSentenceMatch at the index specified
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentenceMatch</code> - match  
+
+| Param | Type |
+| --- | --- |
+| index | <code>number</code> | 
+
+<a name="mergeTokensFromSentence"></a>
+
+## mergeTokensFromSentence() ⇒ <code>ExpressionSentence</code>
+The Expression / ExpressionSentence objects comes from outside the standard CoreNLP pipelines.
+This mean that neither `TokensRegex`, `Semgrex` nor `Tregex` will tag the nodes with POS,
+lemma, NER or any otehr annotation data.  This is sometimes a usful resource to count with, if
+you can apart of getting the matching groups, get the annotated tokens for each word in the
+match group.
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentence</code> - instance = The current instance  
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>ExpressionSentenceJSON</code>
+Update an instance of ExpressionSentence with data provided by a JSON
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentenceJSON</code> - sentence - The current sentence instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>ExpressionSentenceJSON</code> | The expression data, as returned by CoreNLP API service |
+
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>ExpressionSentence</code>
+Get an instance of ExpressionSentence from a given JSON of sentence matches
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentence</code> - sentence - A new ExpressionSentence instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>ExpressionSentenceJSON</code> | The sentence data, as returned by CoreNLP API service |
+
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - expression  
+<a name="pattern"></a>
+
+## pattern() ⇒ <code>string</code>
+Get the pattern
+
+**Kind**: global function  
+**Returns**: <code>string</code> - pattern - The expression pattern  
+<a name="sentences"></a>
+
+## sentences() ⇒ <code>Array.&lt;ExpressionSentence&gt;</code>
+Get a list of sentences
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;ExpressionSentence&gt;</code> - sentences - The expression sentences  
+<a name="sentence"></a>
+
+## sentence(index) ⇒ <code>ExpressionSentence</code>
+Get the sentence for a given index
+
+**Kind**: global function  
+**Returns**: <code>ExpressionSentence</code> - sentence - An expression sentence  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | The position of the sentence to get |
+
+<a name="mergeTokensFromDocument"></a>
+
+## mergeTokensFromDocument(document) ⇒ <code>Expression</code>
+Hydrate the Expression instance with Token objects from an annotated Document
+
+**Kind**: global function  
+**Returns**: <code>Expression</code> - expression - The current expression instance  
+**See**: [ExpressionSentence#mergeTokensFromSentence](ExpressionSentence#mergeTokensFromSentence)  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| document | <code>Document</code> | An annotated document from where to extract the tokens |
+
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>Expression</code>
+Update an instance of Expression with data provided by a JSON
+
+**Kind**: global function  
+**Returns**: <code>Expression</code> - expression - The current expression instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[ExpressionJSON](#ExpressionJSON)</code> | The expression data, as returned by CoreNLP API service |
+
+<a name="fromJson"></a>
+
+## fromJson(data) ⇒ <code>Expression</code>
+Get an instance of Expression from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>Expression</code> - expression - A new Expression instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[ExpressionJSON](#ExpressionJSON)</code> | The expression data, as returned by CoreNLP API service |
+
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - governor  
+<a name="fromJSON"></a>
+
+## fromJSON(data) ⇒ <code>Governor</code>
+Get an instance of Governor from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>Governor</code> - governor - A new Governor instance  
+**Todo**
+
+- [ ] It is not possible to properly generate a Governor from a GovernorJSON
+      the Governor requires references to the Token instances in order to work
+
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[GovernorJSON](#GovernorJSON)</code> | The token data, as returned by CoreNLP API service |
+
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - sentence  
+<a name="index"></a>
+
+## index() ⇒ <code>number</code>
+Get the index relative to the parent document
+
+**Kind**: global function  
+**Returns**: <code>number</code> - index  
+<a name="parse"></a>
+
+## parse() ⇒ <code>string</code>
+Get a string representation of the parse tree structure
+
+**Kind**: global function  
+**Returns**: <code>string</code> - parse  
+<a name="words"></a>
+
+## words() ⇒ <code>Array.&lt;string&gt;</code>
+Get an array of string representations of the sentence words
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - words  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+
+**Requires**: <code>{@link TokenizerAnnotator}</code>  
+<a name="word"></a>
+
+## word(index) ⇒ <code>string</code>
+Get a string representations of the Nth word of the sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - word  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+- <code>Error</code> in case the token for the given index does not exists
+
+**Requires**: <code>{@link TokenizerAnnotator}</code>  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | 0-based index as they are arranged naturally |
+
+<a name="posTags"></a>
+
+## posTags() ⇒ <code>Array.&lt;string&gt;</code>
+Get a string representations of the tokens part of speech of the sentence
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - posTags  
+<a name="posTag"></a>
+
+## posTag(index) ⇒ <code>string</code>
+Get a string representations of the Nth token part of speech of the sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - posTag  
+**Throws**:
+
+- <code>Error</code> in case the token for the given index does not exists
+
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | 0-based index as they are arranged naturally |
+
+<a name="lemmas"></a>
+
+## lemmas() ⇒ <code>Array.&lt;string&gt;</code>
+Get a string representations of the tokens lemmas of the sentence
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - lemmas  
+<a name="lemma"></a>
+
+## lemma(index) ⇒ <code>string</code>
+Get a string representations of the Nth token lemma of the sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - lemma  
+**Throws**:
+
+- <code>Error</code> in case the token for the given index does not exists
+
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | 0-based index as they are arranged naturally |
+
+<a name="nerTags"></a>
+
+## nerTags() ⇒ <code>Array.&lt;string&gt;</code>
+Get a string representations of the tokens nerTags of the sentence
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;string&gt;</code> - nerTags  
+<a name="nerTag"></a>
+
+## nerTag(index) ⇒ <code>string</code>
+Get a string representations of the Nth token nerTag of the sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - nerTag  
+**Throws**:
+
+- <code>Error</code> in case the token for the given index does not exists
+
+
+| Param | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | 0-based index as they are arranged naturally |
+
+<a name="governors"></a>
+
+## governors() ⇒ <code>Array.&lt;Governor&gt;</code>
+Get a list of annotated governors by the dependency-parser
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;Governor&gt;</code> - governors  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+
+**Requires**: <code>{@link DependencyParseAnnotator}</code>  
+<a name="governor"></a>
+
+## governor() ⇒ <code>Governor</code>
+Get the N-th annotated governor by the dependency-parser annotator
+
+**Kind**: global function  
+**Returns**: <code>Governor</code> - governor  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+
+**Requires**: <code>{@link DependencyParseAnnotator}</code>  
+<a name="tokens"></a>
+
+## tokens() ⇒ <code>Array.&lt;Token&gt;</code>
+Get an array of token representations of the sentence words
+
+**Kind**: global function  
+**Returns**: <code>Array.&lt;Token&gt;</code> - tokens  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+
+**Requires**: <code>{@link TokenizerAnnotator}</code>  
+<a name="token"></a>
+
+## token() ⇒ <code>Token</code>
+Get the Nth token of the sentence
+
+**Kind**: global function  
+**Returns**: <code>Token</code> - token  
+**Throws**:
+
+- <code>Error</code> in case the require annotator was not applied to the sentence
+
+**Requires**: <code>{@link TokenizerAnnotator}</code>  
+<a name="toJSON"></a>
+
+## toJSON() ⇒ <code>[SentenceJSON](#SentenceJSON)</code>
+The following arrow function `data => Sentence.fromJSON(data).toJSON()` is idempontent, if
+considering shallow comparison, not by reference.
+This JSON will respects the same structure as it expects from {@see Sentence#fromJSON}.
+
+**Kind**: global function  
+**Returns**: <code>[SentenceJSON](#SentenceJSON)</code> - data  
+<a name="fromJSON"></a>
+
+## fromJSON(data, [isSentence]) ⇒ <code>Sentence</code>
+Update an instance of Sentence with data provided by a JSON
+
+**Kind**: global function  
+**Returns**: <code>Sentence</code> - sentence - The current sentence instance  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| data | <code>[SentenceJSON](#SentenceJSON)</code> |  | The document data, as returned by CoreNLP API service |
+| [isSentence] | <code>boolean</code> | <code>false</code> | Indicate if the given data represents just the sentence or a full document with just a sentence inside |
+
+<a name="fromJSON"></a>
+
+## fromJSON(data, [isSentence]) ⇒ <code>Sentence</code>
+Get an instance of Sentence from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>Sentence</code> - document - A new Sentence instance  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| data | <code>[SentenceJSON](#SentenceJSON)</code> |  | The document data, as returned by CoreNLP API service |
+| [isSentence] | <code>boolean</code> | <code>false</code> | Indicate if the given data represents just the sentence of a full document |
+
+<a name="toString"></a>
+
+## toString() ⇒ <code>string</code>
+Get a string representation
+
+**Kind**: global function  
+**Returns**: <code>string</code> - token  
+<a name="index"></a>
+
+## index() ⇒ <code>number</code>
+Get the `inde ` number associated by the StanfordCoreNLP
+This index is relative to the sentence it belongs to, and is a 1-based (possitive integer).
+This number is useful to match tokens within a sentence for depparse, coreference, etc.
+
+**Kind**: global function  
+**Returns**: <code>number</code> - index  
+<a name="word"></a>
+
+## word() ⇒ <code>string</code>
+Get the original word
+
+**Kind**: global function  
+**Returns**: <code>string</code> - word  
+<a name="originalText"></a>
+
+## originalText() ⇒ <code>string</code>
+Get the original text
+
+**Kind**: global function  
+**Returns**: <code>string</code> - originalText  
+<a name="characterOffsetBegin"></a>
+
+## characterOffsetBegin() ⇒ <code>number</code>
+A 0-based index of the word's initial character within the sentence
+
+**Kind**: global function  
+**Returns**: <code>number</code> - characterOffsetBegin  
+<a name="characterOffsetEnd"></a>
+
+## characterOffsetEnd() ⇒ <code>number</code>
+Get the characterOffsetEnd relative to the parent sentence
+A 0-based index of the word's ending character within the sentence
+
+**Kind**: global function  
+**Returns**: <code>number</code> - characterOffsetEnd  
+<a name="before"></a>
+
+## before() ⇒ <code>string</code>
+Get the `before` string relative to the container sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - before  
+<a name="after"></a>
+
+## after() ⇒ <code>string</code>
+Get the `after` string relative to the container sentence
+
+**Kind**: global function  
+**Returns**: <code>string</code> - after  
+<a name="lemma"></a>
+
+## lemma() ⇒ <code>string</code>
+Get the annotated lemma
+
+**Kind**: global function  
+**Returns**: <code>string</code> - lemma  
+<a name="pos"></a>
+
+## pos() ⇒ <code>string</code>
+Get the annotated part-of-speech for the current token
+
+**Kind**: global function  
+**Returns**: <code>string</code> - pos  
+<a name="posInfo"></a>
+
+## posInfo() ⇒ <code>[PosInfo](#PosInfo)</code>
+Get additional metadata about the POS annotation
+NOTE: Do not use this method other than just for study or analysis purposes.
+
+**Kind**: global function  
+**Returns**: <code>[PosInfo](#PosInfo)</code> - posInfo  
+**See**: [PosInfo](#PosInfo) for more details  
+<a name="ner"></a>
+
+## ner() ⇒ <code>string</code>
+Get the annotated named-entity for the current token
+
+**Kind**: global function  
+**Returns**: <code>string</code> - ner  
+<a name="toJSON"></a>
+
+## toJSON() ⇒ <code>[TokenJSON](#TokenJSON)</code>
+The following arrow function `data => Token.fromJSON(data).toJSON()` is idempontent, if
+considering shallow comparison, not by reference.
+This JSON will respects the same structure as it expects from {@see Token#fromJSON}.
+
+**Kind**: global function  
+**Returns**: <code>[TokenJSON](#TokenJSON)</code> - data  
+<a name="fromJSON"></a>
+
+## fromJSON(data) ⇒ <code>Token</code>
+Get an instance of Token from a given JSON
+
+**Kind**: global function  
+**Returns**: <code>Token</code> - token - A new Token instance  
+
+| Param | Type | Description |
+| --- | --- | --- |
+| data | <code>[TokenJSON](#TokenJSON)</code> | The token data, as returned by CoreNLP API service |
+
+<a name="dump"></a>
+
+## dump() ⇒ <code>string</code>
+Get a Tree string representation for debugging purposes
+
+**Kind**: global function  
+**Returns**: <code>string</code> - tree  
+<a name="visitDeepFirst"></a>
+
+## visitDeepFirst()
+Performs Deep-first Search calling a visitor for each node
+
+**Kind**: global function  
+**See**: [DFS](https://en.wikipedia.org/wiki/Depth-first_search)  
+<a name="visitDeepFirstRight"></a>
+
+## visitDeepFirstRight()
+Performs Deep-first Search calling a visitor for each node, from right to left
+
+**Kind**: global function  
+**See**: [DFS](https://en.wikipedia.org/wiki/Depth-first_search)  
+<a name="visitLeaves"></a>
+
+## visitLeaves()
+Performs Deep-first Search calling a visitor only over leaves
+
+**Kind**: global function  
+**See**: [DFS](https://en.wikipedia.org/wiki/Depth-first_search)  
+<a name="fromSentence"></a>
+
+## fromSentence(sentence, [doubleLink]) ⇒ <code>Tree</code>
+**Kind**: global function  
+**Returns**: <code>Tree</code> - tree  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| sentence | <code>Sentence</code> |  |  |
+| [doubleLink] | <code>boolean</code> | <code>false</code> | whether the child nodes should have a reference to their parent or not - this allows the use of [Node.parent()](Node.parent()) |
+
+<a name="fromString"></a>
+
+## fromString(str, [doubleLink]) ⇒ <code>Tree</code>
+**Kind**: global function  
+**Returns**: <code>Tree</code> - tree  
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| str | <code>string</code> |  |  |
+| [doubleLink] | <code>boolean</code> | <code>false</code> | whether the child nodes should have a reference to their parent or not - this allows the use of [Node.parent()](Node.parent()) |
+
+<a name="DocumentJSON"></a>
+
+## DocumentJSON
+The CoreNLP API JSON structure representing a document
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type |
+| --- | --- |
+| index | <code>number</code> | 
+| sentences | <code>Array.&lt;Sentence&gt;</code> | 
+
+<a name="ExpressionSentenceMatchGroup"></a>
+
+## ExpressionSentenceMatchGroup
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type | Description |
+| --- | --- | --- |
+| label | <code>string</code> | group label |
+| begin | <code>number</code> | 0-based index of the matched group, relative to the given text |
+| end | <code>number</code> | 0-based index of the matched group, relative to the given text |
+| token | <code>Token</code> | onluy given if aggregated with an annotated Sentence or Document |
+| $[label | <code>[ExpressionSentenceMatchGroup](#ExpressionSentenceMatchGroup)</code> | other groups inside |
+
+<a name="ExpressionSentenceMatchJSON"></a>
+
+## ExpressionSentenceMatchJSON
+A ExpressionSentenceMatch of either `TokensRegex`, `Semrgex` or `Tregex`.
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type | Description |
+| --- | --- | --- |
+| begin | <code>number</code> | word begin position, starting from zero |
+| end | <code>number</code> | word end position, starting from zero (no match ends at 0) |
+| text | <code>string</code> | matched text |
+| $[label | <code>string</code> | any label, as defined in the expression pattern |
+
+<a name="ExpressionJSON"></a>
+
+## ExpressionJSON
+The CoreNLP API JSON structure representing an expression
+This expression structure can be found as the output of `TokensRegex`,
+`Semrgex` and `Tregex`.
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type |
+| --- | --- |
+| index | <code>number</code> | 
+| sentences | <code>Array.&lt;Array.&lt;ExpressionSentenceMatch&gt;&gt;</code> | 
+
+<a name="GovernorJSON"></a>
+
+## GovernorJSON
+The CoreNLP API JSON structure representing a governor
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type |
+| --- | --- |
+| dep | <code>string</code> | 
+| governor | <code>number</code> | 
+| governorGloss | <code>string</code> | 
+| dependent | <code>number</code> | 
+| dependentGloss | <code>string</code> | 
+
+<a name="SentenceJSON"></a>
+
+## SentenceJSON
+The CoreNLP API JSON structure representing a sentence
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type | Description |
+| --- | --- | --- |
+| index | <code>number</code> | 1-based index, as they come indexed by StanfordCoreNLP |
+| tokens | <code>Array.&lt;Token&gt;</code> |  |
+
+<a name="TokenJSON"></a>
+
+## TokenJSON
+The CoreNLP API JSON structure representing a token
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type |
+| --- | --- |
+| index | <code>number</code> | 
+| word | <code>string</code> | 
+| originalText | <code>string</code> | 
+| characterOffsetBegin | <code>number</code> | 
+| characterOffsetEnd | <code>number</code> | 
+| before | <code>string</code> | 
+| after | <code>string</code> | 
+
+<a name="PosInfo"></a>
+
+## PosInfo
+PosInfo does not come as part of the CoreNLP.  It is an indexed reference of POS tags
+by language provided by this library.  It's only helpful for analysis and study.  The
+data was collected from different documentation resources on the Web.
+The PosInfo may vary depending on the POS annotation types used, for example, CoreNLP
+for Spanish uses custom POS tags developed by Stanford, but this can also be changed 
+to Universal Dependencies, which uses different tags.
+
+**Kind**: global typedef  
+**Properties**
+
+| Name | Type |
+| --- | --- |
+| group | <code>string</code> | 
+| tag | <code>string</code> | 
+| examples | <code>Array.&lt;string&gt;</code> | 
+
+<a name="DeterministicCorefAnnotator
+TODO ??external_"></a>
+
+## DeterministicCorefAnnotator
+TODO ?? ⇐ <code>Annotator</code>
+Class representing an DeterministicCorefAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [DeterministicCorefAnnotator](https://stanfordnlp.github.io/CoreNLP/coref.html)  
+<a name="DependencyParseAnnotator
+Hydrates {@link Sentence.governors_new}external_"></a>
+
+## DependencyParseAnnotator
+Hydrates {@link Sentence.governors()} ⇐ <code>Annotator</code>
+Class representing an DependencyParseAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [DependencyParseAnnotator](https://stanfordnlp.github.io/CoreNLP/depparse.html)  
+<a name="MorphaAnnotator
+Hydrates {@link Token.lemma_new}external_"></a>
+
+## MorphaAnnotator
+Hydrates {@link Token.lemma()} ⇐ <code>Annotator</code>
+Class representing an MorphaAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [MorphaAnnotator](https://stanfordnlp.github.io/CoreNLP/lemma.html)  
+<a name="NERClassifierCombiner
+Hydrates {@link Token.ner_new}external_"></a>
+
+## NERClassifierCombiner
+Hydrates {@link Token.ner()} ⇐ <code>Annotator</code>
+Class representing an NERClassifierCombiner.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [NERClassifierCombiner](https://stanfordnlp.github.io/CoreNLP/ner.html)  
+<a name="ParserAnnotator
+Hydrates {@link Token.parse_new}external_"></a>
+
+## ParserAnnotator
+Hydrates {@link Token.parse()} ⇐ <code>Annotator</code>
+Class representing an ParserAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [ParserAnnotator](https://stanfordnlp.github.io/CoreNLP/parse.html)  
+<a name="POSTaggerAnnotator
+Hydrates {@link Token.pos_new}external_"></a>
+
+## POSTaggerAnnotator
+Hydrates {@link Token.pos()} ⇐ <code>Annotator</code>
+Class representing an POSTaggerAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [POSTaggerAnnotator](https://stanfordnlp.github.io/CoreNLP/pos.html)  
+<a name="RegexNERAnnotator
+TODO ??external_"></a>
+
+## RegexNERAnnotator
+TODO ?? ⇐ <code>Annotator</code>
+Class representing an RegexNERAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [RegexNERAnnotator](https://stanfordnlp.github.io/CoreNLP/regexner.html)  
+<a name="RelationExtractorAnnotator
+TODO ??external_"></a>
+
+## RelationExtractorAnnotator
+TODO ?? ⇐ <code>Annotator</code>
+Class representing an RelationExtractorAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [RelationExtractorAnnotator](https://stanfordnlp.github.io/CoreNLP/relation.html)  
+<a name="WordsToSentenceAnnotator
+Combines multiple {@link Token}s into sentencesexternal_"></a>
+
+## WordsToSentenceAnnotator
+Combines multiple {@link Token}s into sentences ⇐ <code>Annotator</code>
+Class representing an WordsToSentenceAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [WordsToSentenceAnnotator](https://stanfordnlp.github.io/CoreNLP/ssplit.html)  
+<a name="TokenizerAnnotator
+Identifies {@link Token}sexternal_"></a>
+
+## TokenizerAnnotator
+Identifies {@link Token}s ⇐ <code>Annotator</code>
+Class representing an TokenizerAnnotator.
+
+**Kind**: global external  
+**Extends:** <code>Annotator</code>  
+**See**: [TokenizerAnnotator](https://stanfordnlp.github.io/CoreNLP/tokenize.html)  
+
+## External Reference
 
 We will update this section soon.  In the meantime, you can browse the project codebase and read the @jsdoc referenecs.
 In summary, this NodeJS library aims to replicate the CoreNLP Simple Java interface but in Javascript.  There are some minor differences however, for example the need to call `applyAnnotator` asynchronously.
@@ -144,8 +1573,11 @@ CoreNLP
     Tree                          # http://www.cs.cornell.edu/courses/cs474/2004fa/lec1.pdf
 ```
 
-## Stanford CoreNLP Reference
 
-https://github.com/stanfordnlp/CoreNLP
+* * *
+
+&copy; 2017 Gerardo Bort &lt;gerardobort@gmail.com&gt; under GPL-3.0 Licence. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
+
+## [StanfordCoreNLP Reference](https://github.com/stanfordnlp/CoreNLP)
 
 Manning, Christopher D., Mihai Surdeanu, John Bauer, Jenny Finkel, Steven J. Bethard, and David McClosky. 2014. The Stanford CoreNLP Natural Language Processing Toolkit In Proceedings of the 52nd Annual Meeting of the Association for Computational Linguistics: System Demonstrations, pp. 55-60.
diff --git a/gulpfile.babel.js b/gulpfile.babel.js
new file mode 100644
index 0000000..bc0dea1
--- /dev/null
+++ b/gulpfile.babel.js
@@ -0,0 +1,36 @@
+'use strict';
+
+import fs from 'fs';
+import gulp from 'gulp';
+import concat from 'gulp-concat';
+import babel from 'gulp-babel';
+import copy from 'gulp-copy';
+import gulpJsdoc2md from 'gulp-jsdoc-to-markdown';
+
+gulp.task('default', ['copy', 'transpile']);
+
+gulp.task('transpile', function () {
+  return gulp.src(['src/*', 'src/**/*.js'])
+    .pipe(babel())
+    .pipe(gulp.dest('dist'));
+});
+
+gulp.task('copy', function () {
+  return gulp.src(['src/**/*.json'])
+    .pipe(copy('./dist', { prefix: 1 }))
+    .pipe(gulp.dest('dist'));
+});
+
+gulp.task('doc', () => {
+  return gulp.src([
+      'src/**/*.js',
+      '!src/**/*.spec.js', // omit tests
+      '!src/pipeline.js', // omit ES2017 async files, also customized comma-dangle
+                          // to pass lt ES2017 (see .eslintrc)
+    ])
+    .pipe(concat('README.md'))
+    .pipe(gulpJsdoc2md({
+      template: fs.readFileSync('jsdoc2md/README.hbs', 'utf-8')
+    }))
+    .pipe(gulp.dest(''));
+});
diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index 922e766..0000000
--- a/gulpfile.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const gulp = require('gulp');
-const babel = require('gulp-babel');
-const copy = require('gulp-copy');
-
-gulp.task('default', ['copy', 'transpile']);
-
-gulp.task('transpile', function () {
-  return gulp.src(['src/*', 'src/**/*.js'])
-    .pipe(babel())
-    .pipe(gulp.dest('dist'));
-});
-
-gulp.task('copy', function () {
-  return gulp.src(['src/**/*.json'])
-    .pipe(copy('./dist', { prefix: 1 }))
-    .pipe(gulp.dest('dist'));
-});
diff --git a/jsdoc2md/README.hbs b/jsdoc2md/README.hbs
new file mode 100644
index 0000000..7850f46
--- /dev/null
+++ b/jsdoc2md/README.hbs
@@ -0,0 +1,157 @@
+# NodeJS CoreNLP Library
+
+[![Build Status](https://travis-ci.org/gerardobort/node-corenlp.svg?branch=master)](https://travis-ci.org/gerardobort/node-corenlp)
+
+*This project is under active development, please stay tuned for updates.  More documentation and examples are comming.*
+
+This library connects to Stanford CoreNLP either via HTTP or by spawning processes.  The first (HTTP) is the preferred method since it requires CoreNLP to initialize just once to serve many requests, it also avoids extra I/O given that the CLI method need to write temporary files to run.
+
+## Setup
+
+### 1. Install the package:
+
+```bash
+npm i --save corenlp
+```
+
+### 2. Download Stanford CoreNLP
+
+Via `npm`, run this command from your own project after having installed this library:
+
+```bash
+npm explore corenlp -- npm run corenlp:download
+```
+
+Once downloaded you can easily start the server by running
+
+```bash
+npm explore corenlp -- npm run corenlp:server
+```
+
+Or you can manually download the project from the Stanford's CoreNLP download section at: https://stanfordnlp.github.io/CoreNLP/download.html
+You may want to download, apart of the full package, other language models (see more on that page).
+
+
+### 3. Configure Stanford CoreNLP
+
+#### 3.1. Using StanfordCoreNLPServer
+
+```bash
+# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
+java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
+```
+
+CoreNLP connects by default via StanfordCoreNLPServer, using port 9000.  You can also opt to setup the connection differently:
+
+```javascript
+import CoreNLP, { Properties, Pipeline, ConnectorServer } from 'corenlp';
+
+const connector = new ConnectorServer({ dsn: 'http://localhost:9000' });
+const props = new Properties({
+  annotators: 'tokenize,ssplit,pos,lemma,ner,parse',
+});
+const pipeline = new Pipeline(props, 'English', connector);
+```
+
+#### 3.2. Use CoreNLP via CLI
+
+CoreNLP expects by default the StanfordCoreNLP package to be placed (unzipped) inside the path `${YOUR_NPM_PROJECT_ROOT}/corenlp/`.  You can also opt to setup the CLI interface differently:
+
+```javascript
+import CoreNLP, { Properties, Pipeline, ConnectorCli } from 'corenlp';
+
+const connector = new ConnectorCli({
+  classPath: 'corenlp/stanford-corenlp-full-2017-06-09/*', // specify the paths relative to your npm project root
+  mainClass: 'edu.stanford.nlp.pipeline.StanfordCoreNLP', // optional
+  props: 'StanfordCoreNLP-spanish.properties', // optional
+});
+const props = new Properties({
+  annotators: 'tokenize,ssplit,pos,lemma,ner,parse',
+});
+const pipeline = new Pipeline(props, 'English', connector);
+```
+
+### 4. Usage
+
+```javascript
+// ... initialize pipeline first (see above)
+
+const sent = new CoreNLP.simple.Sentence('Hello world');
+pipeline.annotate(sent)
+  .then(sent => {
+    console.log(sent.words());
+  })
+  .catch(err => {
+    console.log('err', err);
+  });
+```
+
+## Examples
+
+NOTE1: The examples below assumes that StanfordCoreNLP is running on port `9000`.
+NOTE2: The examples below assumes `es6` syntax, if you use require, use as follows: `var CoreNLP = require('corenlp').default;`
+
+### English
+
+```javascript
+import CoreNLP, { Properties, Pipeline } from 'corenlp';
+
+const props = new Properties({
+  annotators: 'tokenize,ssplit,pos,lemma,ner,parse',
+});
+const pipeline = new Pipeline(props, 'English'); // uses ConnectorServer by default
+
+const sent = new CoreNLP.simple.Sentence('The little dog runs so fast.');
+pipeline.annotate(sent)
+  .then(sent => {
+    console.log('parse', sent.parse());
+    console.log(CoreNLP.util.Tree.fromSentence(sent).dump());
+  })
+  .catch(err => {
+    console.log('err', err);
+  });
+```
+
+# API Reference
+{{>main}}
+
+## External Reference
+
+We will update this section soon.  In the meantime, you can browse the project codebase and read the @jsdoc referenecs.
+In summary, this NodeJS library aims to replicate the CoreNLP Simple Java interface but in Javascript.  There are some minor differences however, for example the need to call `applyAnnotator` asynchronously.
+
+```bash
+Properties
+Pipeline
+Service
+ConnectorServer                   # https://stanfordnlp.github.io/CoreNLP/corenlp-server.html
+ConnectorCli                      # https://stanfordnlp.github.io/CoreNLP/cmdline.html
+CoreNLP
+  simple                          # https://stanfordnlp.github.io/CoreNLP/simple.html
+    Annotable
+    Annotator
+    Document
+    Sentence
+    Token
+    annotator                     # https://stanfordnlp.github.io/CoreNLP/annotators.html
+      TokenizerAnnotator          # https://stanfordnlp.github.io/CoreNLP/tokenize.html
+      WordsToSentenceAnnotator    # https://stanfordnlp.github.io/CoreNLP/ssplit.html
+      POSTaggerAnnotator          # https://stanfordnlp.github.io/CoreNLP/pos.html
+      MorphaAnnotator             # https://stanfordnlp.github.io/CoreNLP/lemma.html
+      NERClassifierCombiner       # https://stanfordnlp.github.io/CoreNLP/ner.html
+      ParserAnnotator             # https://stanfordnlp.github.io/CoreNLP/parse.html
+      DependencyParseAnnotator    # https://stanfordnlp.github.io/CoreNLP/depparse.html
+      RelationExtractorAnnotator  # https://stanfordnlp.github.io/CoreNLP/relation.html
+      DeterministicCorefAnnotator # https://stanfordnlp.github.io/CoreNLP/coref.html
+  util
+    Tree                          # http://www.cs.cornell.edu/courses/cs474/2004fa/lec1.pdf
+```
+
+
+* * *
+
+&copy; 2017 Gerardo Bort &lt;gerardobort@gmail.com&gt; under GPL-3.0 Licence. Documented by [jsdoc-to-markdown](https://github.com/75lb/jsdoc-to-markdown).
+
+## [StanfordCoreNLP Reference](https://github.com/stanfordnlp/CoreNLP)
+
+Manning, Christopher D., Mihai Surdeanu, John Bauer, Jenny Finkel, Steven J. Bethard, and David McClosky. 2014. The Stanford CoreNLP Natural Language Processing Toolkit In Proceedings of the 52nd Annual Meeting of the Association for Computational Linguistics: System Demonstrations, pp. 55-60.
diff --git a/package-lock.json b/package-lock.json
index c842a6c..4f110dc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,6 +42,21 @@
       "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=",
       "dev": true
     },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi-escape-sequences": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz",
+      "integrity": "sha1-HBg5S2r5t2/5pjUJ+kl2af0s5T4=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4"
+      }
+    },
     "ansi-escapes": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz",
@@ -90,6 +105,15 @@
       "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
       "dev": true
     },
+    "array-back": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz",
+      "integrity": "sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs=",
+      "dev": true,
+      "requires": {
+        "typical": "2.6.1"
+      }
+    },
     "array-differ": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
@@ -108,6 +132,28 @@
       "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=",
       "dev": true
     },
+    "array-tools": {
+      "version": "1.8.6",
+      "resolved": "https://registry.npmjs.org/array-tools/-/array-tools-1.8.6.tgz",
+      "integrity": "sha1-FFdx9/nJTpjMXqQZapm4MjruGK4=",
+      "dev": true,
+      "requires": {
+        "object-tools": "1.6.7",
+        "typical": "2.6.1"
+      },
+      "dependencies": {
+        "object-tools": {
+          "version": "1.6.7",
+          "resolved": "https://registry.npmjs.org/object-tools/-/object-tools-1.6.7.tgz",
+          "integrity": "sha1-UtQA/IdSUJk9u7O6KY18ebsGmNA=",
+          "dev": true,
+          "requires": {
+            "array-tools": "1.8.6",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "array-union": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@@ -135,6 +181,12 @@
       "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
       "dev": true
     },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "dev": true
+    },
     "asn1": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
@@ -151,6 +203,13 @@
       "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
       "dev": true
     },
+    "async": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+      "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+      "dev": true,
+      "optional": true
+    },
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -895,6 +954,12 @@
       "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
       "dev": true
     },
+    "bluebird": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz",
+      "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=",
+      "dev": true
+    },
     "boom": {
       "version": "2.10.1",
       "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
@@ -977,6 +1042,15 @@
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
       "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
     },
+    "catharsis": {
+      "version": "0.8.9",
+      "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz",
+      "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=",
+      "dev": true,
+      "requires": {
+        "underscore-contrib": "0.3.0"
+      }
+    },
     "chai": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz",
@@ -1034,6 +1108,77 @@
       "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
       "dev": true
     },
+    "cli-commands": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cli-commands/-/cli-commands-0.1.0.tgz",
+      "integrity": "sha1-xXysxAa7z57iFkZgcWHtQy71oFo=",
+      "dev": true,
+      "requires": {
+        "ansi-escape-sequences": "3.0.0",
+        "command-line-args": "3.0.5",
+        "command-line-commands": "1.0.4",
+        "command-line-usage": "3.0.8"
+      },
+      "dependencies": {
+        "command-line-args": {
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+          "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "find-replace": "1.0.3",
+            "typical": "2.6.1"
+          }
+        },
+        "command-line-usage": {
+          "version": "3.0.8",
+          "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+          "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "3.0.0",
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "table-layout": "0.3.0",
+            "typical": "2.6.1"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+          "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+          "dev": true
+        },
+        "table-layout": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+          "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "core-js": "2.5.0",
+            "deep-extend": "0.4.2",
+            "feature-detect-es6": "1.3.1",
+            "typical": "2.6.1",
+            "wordwrapjs": "2.0.0"
+          }
+        },
+        "wordwrapjs": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+          "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "reduce-flatten": "1.0.1",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "cli-cursor": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -1055,17 +1200,55 @@
       "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=",
       "dev": true
     },
+    "clone-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+      "dev": true
+    },
     "clone-stats": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
       "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
       "dev": true
     },
+    "cloneable-readable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+      "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "process-nextick-args": "1.0.7",
+        "through2": "2.0.3"
+      }
+    },
     "co": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
       "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
     },
+    "collect-all": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz",
+      "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==",
+      "dev": true,
+      "requires": {
+        "stream-connect": "1.0.2",
+        "stream-via": "1.0.4"
+      }
+    },
+    "collect-json": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/collect-json/-/collect-json-1.0.8.tgz",
+      "integrity": "sha1-qi+lK00dlETOaQ8HoeNherdLuCc=",
+      "dev": true,
+      "requires": {
+        "collect-all": "1.0.3",
+        "stream-connect": "1.0.2",
+        "stream-via": "1.0.4"
+      }
+    },
     "color-convert": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz",
@@ -1081,6 +1264,97 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
+    "column-layout": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/column-layout/-/column-layout-2.1.4.tgz",
+      "integrity": "sha1-7ShXCSzPgzgCb+U4N52WctcLNkE=",
+      "dev": true,
+      "requires": {
+        "ansi-escape-sequences": "2.2.2",
+        "array-back": "1.0.4",
+        "collect-json": "1.0.8",
+        "command-line-args": "2.1.6",
+        "core-js": "2.5.0",
+        "deep-extend": "0.4.2",
+        "feature-detect-es6": "1.3.1",
+        "object-tools": "2.0.6",
+        "typical": "2.6.1",
+        "wordwrapjs": "1.2.1"
+      },
+      "dependencies": {
+        "ansi-escape-sequences": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-2.2.2.tgz",
+          "integrity": "sha1-F0x41vi33nX4lXroHH9yIQxwFjU=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "collect-all": "0.2.1"
+          }
+        },
+        "collect-all": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-0.2.1.tgz",
+          "integrity": "sha1-ciX7RYXCLU/6yIbwq69avFY6Gmo=",
+          "dev": true,
+          "requires": {
+            "stream-connect": "1.0.2",
+            "stream-via": "0.1.1",
+            "typical": "2.6.1"
+          }
+        },
+        "command-line-args": {
+          "version": "2.1.6",
+          "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-2.1.6.tgz",
+          "integrity": "sha1-8ZfW6v80yQhVd0hLKGQ3WylPVpc=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "command-line-usage": "2.0.5",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "find-replace": "1.0.3",
+            "typical": "2.6.1"
+          }
+        },
+        "command-line-usage": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-2.0.5.tgz",
+          "integrity": "sha1-+Aw1yl6GJIQZI+o747m/v0974ns=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "2.2.2",
+            "array-back": "1.0.4",
+            "column-layout": "2.1.4",
+            "feature-detect-es6": "1.3.1",
+            "typical": "2.6.1",
+            "wordwrapjs": "1.2.1"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+          "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+          "dev": true
+        },
+        "stream-via": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-0.1.1.tgz",
+          "integrity": "sha1-DO5d+clZ+x0/TtpIGfKJ1fkgWvw=",
+          "dev": true
+        },
+        "wordwrapjs": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-1.2.1.tgz",
+          "integrity": "sha1-dUpeoGZM+/9QVA3DLWe9oyifw0s=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "combined-stream": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
@@ -1089,6 +1363,16 @@
         "delayed-stream": "1.0.0"
       }
     },
+    "command-line-commands": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-1.0.4.tgz",
+      "integrity": "sha1-A0+bFntRiK+9z2su+7FQ/IRCwys=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "feature-detect-es6": "1.3.1"
+      }
+    },
     "commander": {
       "version": "2.9.0",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
@@ -1098,6 +1382,12 @@
         "graceful-readlink": "1.0.1"
       }
     },
+    "common-sequence": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-1.0.2.tgz",
+      "integrity": "sha1-MOB/P49vf5s97oVPILLTnu4Ibeg=",
+      "dev": true
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -1147,6 +1437,15 @@
         }
       }
     },
+    "concat-with-sourcemaps": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz",
+      "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.6"
+      }
+    },
     "contains-path": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
@@ -1256,6 +1555,22 @@
       "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=",
       "dev": true
     },
+    "ddata": {
+      "version": "0.1.28",
+      "resolved": "https://registry.npmjs.org/ddata/-/ddata-0.1.28.tgz",
+      "integrity": "sha1-UxOPr6PwF0nqJFHRK2tt2d8dWx8=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "core-js": "2.5.0",
+        "handlebars": "3.0.3",
+        "marked": "0.3.6",
+        "object-get": "2.1.0",
+        "reduce-flatten": "1.0.1",
+        "string-tools": "1.0.0",
+        "test-value": "2.1.0"
+      }
+    },
     "debug": {
       "version": "2.6.8",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
@@ -1297,6 +1612,12 @@
         "clone": "1.0.2"
       }
     },
+    "defer-promise": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/defer-promise/-/defer-promise-1.0.1.tgz",
+      "integrity": "sha1-HKb/7dvO8XFd16riXHYW+a4iky8=",
+      "dev": true
+    },
     "del": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
@@ -1795,6 +2116,15 @@
       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
       "dev": true
     },
+    "feature-detect-es6": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.3.1.tgz",
+      "integrity": "sha1-+IhzavnLDJH1VmO/pHYuuW7nBH8=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4"
+      }
+    },
     "figures": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -1822,6 +2152,16 @@
         }
       }
     },
+    "file-set": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/file-set/-/file-set-1.1.1.tgz",
+      "integrity": "sha1-0+xwwIDsjxjyBLod4QZ4DJBWkms=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "glob": "7.1.1"
+      }
+    },
     "filename-regex": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
@@ -1841,12 +2181,43 @@
         "repeat-string": "1.6.1"
       }
     },
+    "filter-where": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/filter-where/-/filter-where-1.0.1.tgz",
+      "integrity": "sha1-GwQlae3ONrwcTp9zdA0sTi/u930=",
+      "dev": true,
+      "requires": {
+        "test-value": "1.1.0"
+      },
+      "dependencies": {
+        "test-value": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
+          "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "find-index": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
       "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
       "dev": true
     },
+    "find-replace": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz",
+      "integrity": "sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "test-value": "2.1.0"
+      }
+    },
     "find-up": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
@@ -2316,6 +2687,51 @@
         "vinyl-sourcemaps-apply": "0.2.1"
       }
     },
+    "gulp-concat": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
+      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
+      "dev": true,
+      "requires": {
+        "concat-with-sourcemaps": "1.0.4",
+        "through2": "2.0.3",
+        "vinyl": "2.1.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+          "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+          "dev": true
+        },
+        "clone-stats": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+          "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
+          "dev": true
+        },
+        "replace-ext": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+          "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+          "dev": true
+        },
+        "vinyl": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+          "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+          "dev": true,
+          "requires": {
+            "clone": "2.1.1",
+            "clone-buffer": "1.0.0",
+            "clone-stats": "1.0.0",
+            "cloneable-readable": "1.0.0",
+            "remove-trailing-separator": "1.0.2",
+            "replace-ext": "1.0.0"
+          }
+        }
+      }
+    },
     "gulp-copy": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/gulp-copy/-/gulp-copy-1.0.1.tgz",
@@ -2327,6 +2743,449 @@
         "through2": "2.0.3"
       }
     },
+    "gulp-jsdoc-to-markdown": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/gulp-jsdoc-to-markdown/-/gulp-jsdoc-to-markdown-1.2.2.tgz",
+      "integrity": "sha1-vQ4mfjlyvBaee9uZL5Z4I7Aj/v0=",
+      "dev": true,
+      "requires": {
+        "gulp-util": "3.0.8",
+        "jsdoc-to-markdown": "1.3.9",
+        "through2": "2.0.3"
+      },
+      "dependencies": {
+        "app-usage-stats": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/app-usage-stats/-/app-usage-stats-0.4.1.tgz",
+          "integrity": "sha1-l+ubibVnj6LdyXk7EphijMIYQp8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "home-path": "1.0.5",
+            "test-value": "2.1.0",
+            "usage-stats": "0.8.6"
+          },
+          "dependencies": {
+            "test-value": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+              "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "typical": "2.6.1"
+              }
+            }
+          }
+        },
+        "array-tools": {
+          "version": "2.0.9",
+          "resolved": "https://registry.npmjs.org/array-tools/-/array-tools-2.0.9.tgz",
+          "integrity": "sha1-WlEd56Qb4O7J/9zUkS0K+fDKyjU=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "2.2.2",
+            "array-back": "1.0.4",
+            "collect-json": "1.0.8",
+            "filter-where": "1.0.1",
+            "object-get": "2.1.0",
+            "reduce-extract": "1.0.0",
+            "reduce-flatten": "1.0.1",
+            "reduce-unique": "1.0.0",
+            "reduce-without": "1.0.1",
+            "sort-array": "1.1.2",
+            "test-value": "1.1.0"
+          },
+          "dependencies": {
+            "ansi-escape-sequences": {
+              "version": "2.2.2",
+              "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-2.2.2.tgz",
+              "integrity": "sha1-F0x41vi33nX4lXroHH9yIQxwFjU=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "collect-all": "0.2.1"
+              }
+            }
+          }
+        },
+        "cache-point": {
+          "version": "0.3.4",
+          "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-0.3.4.tgz",
+          "integrity": "sha1-FS21Asa7I7WqP2Y+Iw1d6OxOTz8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "fs-then-native": "1.0.2",
+            "mkdirp": "0.5.1"
+          }
+        },
+        "collect-all": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-0.2.1.tgz",
+          "integrity": "sha1-ciX7RYXCLU/6yIbwq69avFY6Gmo=",
+          "dev": true,
+          "requires": {
+            "stream-connect": "1.0.2",
+            "stream-via": "0.1.1",
+            "typical": "2.6.1"
+          }
+        },
+        "command-line-args": {
+          "version": "3.0.5",
+          "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz",
+          "integrity": "sha1-W9StReeYPlwTRJGOQCgO4mk8WsA=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "find-replace": "1.0.3",
+            "typical": "2.6.1"
+          }
+        },
+        "command-line-tool": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.5.2.tgz",
+          "integrity": "sha1-+H1pd/VrvdLV38+UY0XdLNnGpTo=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "2.2.2",
+            "array-back": "1.0.4",
+            "command-line-args": "3.0.5",
+            "command-line-usage": "3.0.8",
+            "feature-detect-es6": "1.3.1",
+            "typical": "2.6.1"
+          },
+          "dependencies": {
+            "ansi-escape-sequences": {
+              "version": "2.2.2",
+              "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-2.2.2.tgz",
+              "integrity": "sha1-F0x41vi33nX4lXroHH9yIQxwFjU=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "collect-all": "0.2.1"
+              }
+            }
+          }
+        },
+        "command-line-usage": {
+          "version": "3.0.8",
+          "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz",
+          "integrity": "sha1-tqIJeMGzg0d/XBGlKUKLiAv+D00=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "3.0.0",
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "table-layout": "0.3.0",
+            "typical": "2.6.1"
+          }
+        },
+        "config-master": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/config-master/-/config-master-2.0.4.tgz",
+          "integrity": "sha1-50lQXF0/lG8vrTx23+cfymiXUdw=",
+          "dev": true,
+          "requires": {
+            "babel-polyfill": "6.23.0",
+            "feature-detect-es6": "1.3.1",
+            "walk-back": "2.0.1"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+          "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+          "dev": true
+        },
+        "dmd": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/dmd/-/dmd-1.4.2.tgz",
+          "integrity": "sha1-sTBLmKVwCmv+Xc+RvmV8mBcApLw=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "command-line-tool": "0.5.2",
+            "common-sequence": "1.0.2",
+            "ddata": "0.1.28",
+            "file-set": "1.1.1",
+            "handlebars-array": "0.2.1",
+            "handlebars-comparison": "2.0.1",
+            "handlebars-json": "1.0.1",
+            "handlebars-regexp": "1.0.1",
+            "handlebars-string": "2.0.2",
+            "object-tools": "2.0.6",
+            "reduce-unique": "1.0.0",
+            "reduce-without": "1.0.1",
+            "stream-handlebars": "0.1.6",
+            "string-tools": "1.0.0",
+            "walk-back": "2.0.1"
+          }
+        },
+        "fs-then-native": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-1.0.2.tgz",
+          "integrity": "sha1-rI04B8nxu9Enlgf7Io4Ktkm7Qf4=",
+          "dev": true,
+          "requires": {
+            "feature-detect-es6": "1.3.1"
+          }
+        },
+        "glob": {
+          "version": "4.5.3",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+          "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+          "dev": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "2.0.10",
+            "once": "1.4.0"
+          }
+        },
+        "jsdoc-api": {
+          "version": "1.2.4",
+          "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-1.2.4.tgz",
+          "integrity": "sha1-UBIjWSe/rR4nvIjQew3d2y06ilk=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "cache-point": "0.3.4",
+            "collect-all": "1.0.3",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "file-set": "1.1.1",
+            "jsdoc-75lb": "3.6.0",
+            "object-to-spawn-args": "1.1.1",
+            "promise.prototype.finally": "1.0.1",
+            "temp-path": "1.0.0",
+            "then-fs": "2.0.0",
+            "walk-back": "2.0.1"
+          },
+          "dependencies": {
+            "collect-all": {
+              "version": "1.0.3",
+              "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz",
+              "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==",
+              "dev": true,
+              "requires": {
+                "stream-connect": "1.0.2",
+                "stream-via": "1.0.4"
+              }
+            },
+            "stream-via": {
+              "version": "1.0.4",
+              "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz",
+              "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==",
+              "dev": true
+            }
+          }
+        },
+        "jsdoc-parse": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-1.2.7.tgz",
+          "integrity": "sha1-VLdIGzzWvLfBc9xPpp7pJzXqJSU=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "2.2.2",
+            "array-tools": "2.0.9",
+            "collect-json": "1.0.8",
+            "command-line-args": "2.1.6",
+            "command-line-tool": "0.1.0",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "file-set": "0.2.8",
+            "jsdoc-api": "1.2.4",
+            "object-tools": "2.0.6",
+            "stream-connect": "1.0.2",
+            "test-value": "1.1.0"
+          },
+          "dependencies": {
+            "ansi-escape-sequences": {
+              "version": "2.2.2",
+              "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-2.2.2.tgz",
+              "integrity": "sha1-F0x41vi33nX4lXroHH9yIQxwFjU=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "collect-all": "0.2.1"
+              }
+            },
+            "command-line-args": {
+              "version": "2.1.6",
+              "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-2.1.6.tgz",
+              "integrity": "sha1-8ZfW6v80yQhVd0hLKGQ3WylPVpc=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "command-line-usage": "2.0.5",
+                "core-js": "2.5.0",
+                "feature-detect-es6": "1.3.1",
+                "find-replace": "1.0.3",
+                "typical": "2.6.1"
+              }
+            },
+            "command-line-tool": {
+              "version": "0.1.0",
+              "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.1.0.tgz",
+              "integrity": "sha1-kaEbpIrGOkpodVQ2eYD3xkI8FJ0=",
+              "dev": true,
+              "requires": {
+                "ansi-escape-sequences": "2.2.2",
+                "array-back": "1.0.4"
+              }
+            },
+            "command-line-usage": {
+              "version": "2.0.5",
+              "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-2.0.5.tgz",
+              "integrity": "sha1-+Aw1yl6GJIQZI+o747m/v0974ns=",
+              "dev": true,
+              "requires": {
+                "ansi-escape-sequences": "2.2.2",
+                "array-back": "1.0.4",
+                "column-layout": "2.1.4",
+                "feature-detect-es6": "1.3.1",
+                "typical": "2.6.1",
+                "wordwrapjs": "1.2.1"
+              }
+            },
+            "file-set": {
+              "version": "0.2.8",
+              "resolved": "https://registry.npmjs.org/file-set/-/file-set-0.2.8.tgz",
+              "integrity": "sha1-c6ZXHpy+UaxZJsiL1WfREfg28Xg=",
+              "dev": true,
+              "requires": {
+                "array-tools": "2.0.9",
+                "glob": "4.5.3"
+              }
+            },
+            "wordwrapjs": {
+              "version": "1.2.1",
+              "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-1.2.1.tgz",
+              "integrity": "sha1-dUpeoGZM+/9QVA3DLWe9oyifw0s=",
+              "dev": true,
+              "requires": {
+                "array-back": "1.0.4",
+                "typical": "2.6.1"
+              }
+            }
+          }
+        },
+        "jsdoc-to-markdown": {
+          "version": "1.3.9",
+          "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-1.3.9.tgz",
+          "integrity": "sha1-d0wOzg69C8wyYbLJoqqNE5mmFHI=",
+          "dev": true,
+          "requires": {
+            "ansi-escape-sequences": "3.0.0",
+            "command-line-args": "3.0.5",
+            "command-line-usage": "3.0.8",
+            "config-master": "2.0.4",
+            "dmd": "1.4.2",
+            "jsdoc-parse": "1.2.7",
+            "jsdoc2md-stats": "1.0.6",
+            "object-tools": "2.0.6",
+            "stream-connect": "1.0.2"
+          }
+        },
+        "jsdoc2md-stats": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/jsdoc2md-stats/-/jsdoc2md-stats-1.0.6.tgz",
+          "integrity": "sha1-3A4AKuu9D7rlEjU0+Scyr7xlH78=",
+          "dev": true,
+          "requires": {
+            "app-usage-stats": "0.4.1",
+            "feature-detect-es6": "1.3.1"
+          }
+        },
+        "minimatch": {
+          "version": "2.0.10",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+          "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.8"
+          }
+        },
+        "req-then": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/req-then/-/req-then-0.5.1.tgz",
+          "integrity": "sha1-McbgtW9N3SrNbeC6G86ne2B5398=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "defer-promise": "1.0.1",
+            "feature-detect-es6": "1.3.1",
+            "lodash.pick": "4.4.0",
+            "typical": "2.6.1"
+          }
+        },
+        "stream-via": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-0.1.1.tgz",
+          "integrity": "sha1-DO5d+clZ+x0/TtpIGfKJ1fkgWvw=",
+          "dev": true
+        },
+        "table-layout": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz",
+          "integrity": "sha1-buINxIPbNxs+XIf3BO0vfHmdLJo=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "core-js": "2.5.0",
+            "deep-extend": "0.4.2",
+            "feature-detect-es6": "1.3.1",
+            "typical": "2.6.1",
+            "wordwrapjs": "2.0.0"
+          }
+        },
+        "test-value": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
+          "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "typical": "2.6.1"
+          }
+        },
+        "usage-stats": {
+          "version": "0.8.6",
+          "resolved": "https://registry.npmjs.org/usage-stats/-/usage-stats-0.8.6.tgz",
+          "integrity": "sha512-QS1r7a1h5g1jo6KulvVGV+eQM+Jfj87AjJBfr1iaIJYz+N7+Qh7ezaVFCulwBGd8T1EidRiSYphG17gra2y0kg==",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "cli-commands": "0.1.0",
+            "core-js": "2.5.0",
+            "feature-detect-es6": "1.3.1",
+            "home-path": "1.0.5",
+            "mkdirp2": "1.0.3",
+            "req-then": "0.5.1",
+            "typical": "2.6.1",
+            "uuid": "3.1.0"
+          }
+        },
+        "wordwrapjs": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz",
+          "integrity": "sha1-q1X2leYRjak4WP3XDAU9HF4BrCA=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "feature-detect-es6": "1.3.1",
+            "reduce-flatten": "1.0.1",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "gulp-util": {
       "version": "3.0.8",
       "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
@@ -2370,6 +3229,76 @@
         "glogg": "1.0.0"
       }
     },
+    "handlebars": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.3.tgz",
+      "integrity": "sha1-DgllGi8Ps8lJFgWDcQ1VH5Lm0q0=",
+      "dev": true,
+      "requires": {
+        "optimist": "0.6.1",
+        "source-map": "0.1.43",
+        "uglify-js": "2.3.6"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        }
+      }
+    },
+    "handlebars-array": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/handlebars-array/-/handlebars-array-0.2.1.tgz",
+      "integrity": "sha1-3Vg5WlJh1mGYjo13Ug67+q3GvSQ=",
+      "dev": true,
+      "requires": {
+        "array-tools": "1.8.6"
+      }
+    },
+    "handlebars-comparison": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/handlebars-comparison/-/handlebars-comparison-2.0.1.tgz",
+      "integrity": "sha1-sXuV0sKYV45K6tOPX6xG6PYAWFU=",
+      "dev": true,
+      "requires": {
+        "array-tools": "1.8.6"
+      }
+    },
+    "handlebars-json": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/handlebars-json/-/handlebars-json-1.0.1.tgz",
+      "integrity": "sha1-Lvh7t4JVHNZFu0aRuCTpZT7AJQQ=",
+      "dev": true
+    },
+    "handlebars-regexp": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/handlebars-regexp/-/handlebars-regexp-1.0.1.tgz",
+      "integrity": "sha1-X0fwZyYOm6jlLxooCRf3DeOfEeQ=",
+      "dev": true
+    },
+    "handlebars-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/handlebars-string/-/handlebars-string-2.0.2.tgz",
+      "integrity": "sha1-ufkiCKl5z89R/0qQ3voYPcYpQso=",
+      "dev": true,
+      "requires": {
+        "array-tools": "1.8.6",
+        "string-tools": "0.1.8"
+      },
+      "dependencies": {
+        "string-tools": {
+          "version": "0.1.8",
+          "resolved": "https://registry.npmjs.org/string-tools/-/string-tools-0.1.8.tgz",
+          "integrity": "sha1-cIhOhqJu5RA6B4vvZwM9VY024zc=",
+          "dev": true
+        }
+      }
+    },
     "har-schema": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
@@ -2443,6 +3372,12 @@
         "os-tmpdir": "1.0.2"
       }
     },
+    "home-path": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz",
+      "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=",
+      "dev": true
+    },
     "homedir-polyfill": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
@@ -2839,6 +3774,12 @@
         "esprima": "4.0.0"
       }
     },
+    "js2xmlparser": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz",
+      "integrity": "sha1-WhcPLo1kds5FQF4EgjJCUTeC/jA=",
+      "dev": true
+    },
     "jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
@@ -2851,6 +3792,44 @@
       "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==",
       "dev": true
     },
+    "jsdoc-75lb": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/jsdoc-75lb/-/jsdoc-75lb-3.6.0.tgz",
+      "integrity": "sha1-qAcRlSi0AJzLyrSbdSL2P+xs0L0=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.4.7",
+        "catharsis": "0.8.9",
+        "escape-string-regexp": "1.0.5",
+        "espree": "3.1.7",
+        "js2xmlparser": "1.0.0",
+        "klaw": "1.3.1",
+        "marked": "0.3.6",
+        "mkdirp": "0.5.1",
+        "requizzle": "0.2.1",
+        "strip-json-comments": "2.0.1",
+        "taffydb": "2.6.2",
+        "underscore": "1.8.3"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+          "dev": true
+        },
+        "espree": {
+          "version": "3.1.7",
+          "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.7.tgz",
+          "integrity": "sha1-/V3ux2qXpRIKnNOnyxF3oJI7EdI=",
+          "dev": true,
+          "requires": {
+            "acorn": "3.3.0",
+            "acorn-jsx": "3.0.1"
+          }
+        }
+      }
+    },
     "jsesc": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
@@ -2931,6 +3910,24 @@
         "is-buffer": "1.1.5"
       }
     },
+    "klaw": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+      "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11"
+      },
+      "dependencies": {
+        "graceful-fs": {
+          "version": "4.1.11",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
     "levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -3147,6 +4144,12 @@
       "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
       "dev": true
     },
+    "lodash.pick": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
+      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+      "dev": true
+    },
     "lodash.restparam": {
       "version": "3.6.1",
       "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
@@ -3213,6 +4216,12 @@
       "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
       "dev": true
     },
+    "marked": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz",
+      "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=",
+      "dev": true
+    },
     "micromatch": {
       "version": "2.3.11",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
@@ -3285,6 +4294,12 @@
         "minimist": "0.0.8"
       }
     },
+    "mkdirp2": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.3.tgz",
+      "integrity": "sha1-zI3YJl8fBuLY9bELblL04FC+0hs=",
+      "dev": true
+    },
     "mocha": {
       "version": "3.5.0",
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz",
@@ -5032,6 +6047,43 @@
       "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
       "dev": true
     },
+    "object-get": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.0.tgz",
+      "integrity": "sha1-ciu9tgA576R8rTxtws5RqFwCxa4=",
+      "dev": true
+    },
+    "object-to-spawn-args": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-1.1.1.tgz",
+      "integrity": "sha1-d9qIJ/Bz0BHJ4bFz+JV4FHAkZ4U=",
+      "dev": true
+    },
+    "object-tools": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/object-tools/-/object-tools-2.0.6.tgz",
+      "integrity": "sha1-8/4cNQzaSm9dmdlkbcSJKgJHbd0=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "collect-json": "1.0.8",
+        "object-get": "2.1.0",
+        "test-value": "1.1.0",
+        "typical": "2.6.1"
+      },
+      "dependencies": {
+        "test-value": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
+          "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
     "object.defaults": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
@@ -5098,6 +6150,24 @@
         "mimic-fn": "1.1.0"
       }
     },
+    "optimist": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+      "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8",
+        "wordwrap": "0.0.3"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+          "dev": true
+        }
+      }
+    },
     "optionator": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
@@ -5349,11 +6419,26 @@
       "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
       "dev": true
     },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "dev": true,
+      "requires": {
+        "asap": "2.0.6"
+      }
+    },
     "promise-polyfill": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.0.2.tgz",
       "integrity": "sha1-2chtPcTcLfkBboiUbe/Wm0m0EWI="
     },
+    "promise.prototype.finally": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-1.0.1.tgz",
+      "integrity": "sha1-kRgvkckkhplXQPoF4NqUKsmGvvo=",
+      "dev": true
+    },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -5498,6 +6583,48 @@
         "resolve": "1.4.0"
       }
     },
+    "reduce-extract": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/reduce-extract/-/reduce-extract-1.0.0.tgz",
+      "integrity": "sha1-Z/I4W+2mUGG19fQxJmLosIDKFSU=",
+      "dev": true,
+      "requires": {
+        "test-value": "1.1.0"
+      },
+      "dependencies": {
+        "test-value": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/test-value/-/test-value-1.1.0.tgz",
+          "integrity": "sha1-oJE29y7AQ9J8iTcHwrFZv6196T8=",
+          "dev": true,
+          "requires": {
+            "array-back": "1.0.4",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
+    "reduce-flatten": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
+      "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+      "dev": true
+    },
+    "reduce-unique": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-1.0.0.tgz",
+      "integrity": "sha1-flhrz4ek4ytter2Cd/rWzeyfSAM=",
+      "dev": true
+    },
+    "reduce-without": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz",
+      "integrity": "sha1-aK0OrRGFXJo31OglbBW7+Hly/Iw=",
+      "dev": true,
+      "requires": {
+        "test-value": "2.1.0"
+      }
+    },
     "regenerate": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz",
@@ -5647,6 +6774,23 @@
         "resolve-from": "1.0.1"
       }
     },
+    "requizzle": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz",
+      "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=",
+      "dev": true,
+      "requires": {
+        "underscore": "1.6.0"
+      },
+      "dependencies": {
+        "underscore": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+          "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+          "dev": true
+        }
+      }
+    },
     "resolve": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
@@ -5814,6 +6958,17 @@
         "hoek": "2.16.3"
       }
     },
+    "sort-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-1.1.2.tgz",
+      "integrity": "sha1-uImGBTwBcKf53mPxiknsecJMPmQ=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "object-get": "2.1.0",
+        "typical": "2.6.1"
+      }
+    },
     "source-map": {
       "version": "0.5.6",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
@@ -5889,18 +7044,61 @@
       "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
       "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
     },
+    "stream-connect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz",
+      "integrity": "sha1-GLyB8u2zW4tdmoAJIAqYUxRCipc=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4"
+      }
+    },
     "stream-consume": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
       "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
       "dev": true
     },
+    "stream-handlebars": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/stream-handlebars/-/stream-handlebars-0.1.6.tgz",
+      "integrity": "sha1-cwW1BkID2hcWCMR4rPZCoUmJKi8=",
+      "dev": true,
+      "requires": {
+        "handlebars": "3.0.3",
+        "object-tools": "1.6.7"
+      },
+      "dependencies": {
+        "object-tools": {
+          "version": "1.6.7",
+          "resolved": "https://registry.npmjs.org/object-tools/-/object-tools-1.6.7.tgz",
+          "integrity": "sha1-UtQA/IdSUJk9u7O6KY18ebsGmNA=",
+          "dev": true,
+          "requires": {
+            "array-tools": "1.8.6",
+            "typical": "2.6.1"
+          }
+        }
+      }
+    },
+    "stream-via": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz",
+      "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==",
+      "dev": true
+    },
     "string_decoder": {
       "version": "0.10.31",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
       "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
       "dev": true
     },
+    "string-tools": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/string-tools/-/string-tools-1.0.0.tgz",
+      "integrity": "sha1-xpqdV4iFiZfaZvHZI7pxE+pGa1o=",
+      "dev": true
+    },
     "string-width": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -5981,6 +7179,28 @@
         "string-width": "2.1.1"
       }
     },
+    "taffydb": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
+      "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
+      "dev": true
+    },
+    "temp-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz",
+      "integrity": "sha1-JLFUOXOrRCiW2a02fdnL2/r+kYs=",
+      "dev": true
+    },
+    "test-value": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz",
+      "integrity": "sha1-Edpv9nDzRxpztiXKTz/c97t0gpE=",
+      "dev": true,
+      "requires": {
+        "array-back": "1.0.4",
+        "typical": "2.6.1"
+      }
+    },
     "text-encoding": {
       "version": "0.6.4",
       "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
@@ -5993,6 +7213,15 @@
       "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
       "dev": true
     },
+    "then-fs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz",
+      "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=",
+      "dev": true,
+      "requires": {
+        "promise": "7.3.1"
+      }
+    },
     "through": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -6143,12 +7372,82 @@
       "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
       "dev": true
     },
+    "typical": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
+      "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz",
+      "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "async": "0.2.10",
+        "optimist": "0.3.7",
+        "source-map": "0.1.43"
+      },
+      "dependencies": {
+        "optimist": {
+          "version": "0.3.7",
+          "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz",
+          "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "wordwrap": "0.0.3"
+          }
+        },
+        "source-map": {
+          "version": "0.1.43",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "amdefine": "1.0.1"
+          }
+        },
+        "wordwrap": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+          "dev": true,
+          "optional": true
+        }
+      }
+    },
     "unc-path-regex": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
       "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
       "dev": true
     },
+    "underscore": {
+      "version": "1.8.3",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+      "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+      "dev": true
+    },
+    "underscore-contrib": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz",
+      "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=",
+      "dev": true,
+      "requires": {
+        "underscore": "1.6.0"
+      },
+      "dependencies": {
+        "underscore": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+          "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+          "dev": true
+        }
+      }
+    },
     "unique-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
@@ -6284,6 +7583,12 @@
         "source-map": "0.5.6"
       }
     },
+    "walk-back": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz",
+      "integrity": "sha1-VU4qnYdPrEeoywBr9EwvDEmYoKQ=",
+      "dev": true
+    },
     "which": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
diff --git a/package.json b/package.json
index e79306e..3a16fd4 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,18 @@
     "lint": "eslint 'src/**/*.js' 'test/*.js'",
     "lint:fix": "npm run lint -- --fix",
     "test": "nyc --reporter=html --reporter=text mocha --require babel-polyfill test/setup.js --sort 'src/**/*.spec.js' --compilers js:babel-core/register --timeout 30000",
-    "test:watch": "npm run test -- --watch"
+    "test:watch": "npm run test -- --watch",
+    "doc": "gulp doc"
+  },
+  "babel": {
+    "plugins": [
+      "transform-async-to-generator",
+      "transform-object-rest-spread"
+    ],
+    "presets": [
+      "es2015",
+      "es2017"
+    ]
   },
   "repository": {
     "type": "git",
@@ -37,18 +48,9 @@
     "url": "https://github.com/gerardobort/node-corenlp/issues"
   },
   "homepage": "https://github.com/gerardobort/node-corenlp#readme",
-  "babel": {
-    "plugins": [
-      "transform-object-rest-spread"
-    ],
-    "presets": [
-      "es2015",
-      "es2017"
-    ]
-  },
   "devDependencies": {
     "babel-core": "^6.25.0",
-    "babel-plugin-transform-export-extensions": "^6.22.0",
+    "babel-plugin-transform-async-to-generator": "^6.24.1",
     "babel-plugin-transform-object-rest-spread": "^6.26.0",
     "babel-polyfill": "^6.23.0",
     "babel-preset-env": "^1.6.0",
@@ -61,7 +63,9 @@
     "eslint-plugin-import": "^2.7.0",
     "gulp": "^3.9.1",
     "gulp-babel": "^7.0.0",
+    "gulp-concat": "^2.6.1",
     "gulp-copy": "^1.0.1",
+    "gulp-jsdoc-to-markdown": "^1.2.2",
     "mocha": "^3.5.0",
     "nyc": "^11.1.0",
     "sinon": "^3.1.0",
diff --git a/src/connector/connector-server.spec.js b/src/connector/connector-server.spec.js
index 3f004df..89dc9d1 100644
--- a/src/connector/connector-server.spec.js
+++ b/src/connector/connector-server.spec.js
@@ -34,7 +34,7 @@ describe('ConnectorServer', () => {
         expect(connector._makeRequest).to.be.have.been.calledWith(
           'http://localhost:9000',
           'pipelineLanguage=LanguageStub&properties={"annotators":"a,b,c","optionA":1,"optionB":2,"outputFormat":"json"}',
-          'xyz',
+          'xyz'
         );
       });
     });
@@ -51,7 +51,7 @@ describe('ConnectorServer', () => {
         expect(connector._makeRequest).to.be.have.been.calledWith(
           'http://localhost:9000/semgrex',
           'pipelineLanguage=LanguageStub&properties={"annotators":"a,b,c","optionA":1,"optionB":2,"semgrex.pattern":"{ner:/.*/}=stub","outputFormat":"json"}&pattern=%7Bner:/.*/%7D=stub',
-          'xyz',
+          'xyz'
         );
       });
     });
diff --git a/src/simple/annotator.js b/src/simple/annotator.js
index 08fe02e..0923c62 100644
--- a/src/simple/annotator.js
+++ b/src/simple/annotator.js
@@ -75,12 +75,9 @@ export default class Annotator {
    */
   pipeline() {
     return _.uniq(
-      _.flatten(
-        this.dependencies()
-          .map(annotator => annotator.pipeline()),
-      )
-        .concat([this.toString()]),
-    );
+      _.flatten(this.dependencies()
+        .map(annotator => annotator.pipeline()))
+        .concat([this.toString()]));
   }
 
   /**
@@ -94,7 +91,6 @@ export default class Annotator {
       this.dependencies().map(annotator => annotator.pipelineOptions())
         .concat(Object.keys(this.options()).map(opt => ({ [`${this}.${opt}`]: this.option(opt) }))),
       (ac, option) => ({ ...ac, ...option }),
-      {},
-    );
+      {});
   }
 }
diff --git a/src/simple/annotator/dcoref.js b/src/simple/annotator/dcoref.js
index ccfcd72..c5d8349 100644
--- a/src/simple/annotator/dcoref.js
+++ b/src/simple/annotator/dcoref.js
@@ -32,7 +32,7 @@ export default class DeterministicCorefAnnotator extends Annotator {
         new MorphaAnnotator(),
         new NERClassifierCombiner(),
         new ParserAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/depparse.js b/src/simple/annotator/depparse.js
index a3974c3..b27b8bc 100644
--- a/src/simple/annotator/depparse.js
+++ b/src/simple/annotator/depparse.js
@@ -27,7 +27,7 @@ export default class DependencyParseAnnotator extends Annotator {
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
         new POSTaggerAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/lemma.js b/src/simple/annotator/lemma.js
index 8e26699..024e999 100644
--- a/src/simple/annotator/lemma.js
+++ b/src/simple/annotator/lemma.js
@@ -26,7 +26,7 @@ export default class MorphaAnnotator extends Annotator {
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
         new POSTaggerAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/ner.js b/src/simple/annotator/ner.js
index 112b79d..14344cf 100644
--- a/src/simple/annotator/ner.js
+++ b/src/simple/annotator/ner.js
@@ -30,7 +30,7 @@ export default class NERClassifierCombiner extends Annotator {
       [
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/parse.js b/src/simple/annotator/parse.js
index afb4b4e..89dcf63 100644
--- a/src/simple/annotator/parse.js
+++ b/src/simple/annotator/parse.js
@@ -30,7 +30,7 @@ export default class ParserAnnotator extends Annotator {
       [
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/pos.js b/src/simple/annotator/pos.js
index 80b01dd..89ee514 100644
--- a/src/simple/annotator/pos.js
+++ b/src/simple/annotator/pos.js
@@ -24,7 +24,7 @@ export default class POSTaggerAnnotator extends Annotator {
       [
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/regexner.js b/src/simple/annotator/regexner.js
index 7bf573f..baee3e1 100644
--- a/src/simple/annotator/regexner.js
+++ b/src/simple/annotator/regexner.js
@@ -35,7 +35,7 @@ export default class RegexNERAnnotator extends Annotator {
       [
         new TokenizerAnnotator(),
         new WordsToSentenceAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/relation.js b/src/simple/annotator/relation.js
index 5cb06fe..f048cfc 100644
--- a/src/simple/annotator/relation.js
+++ b/src/simple/annotator/relation.js
@@ -32,7 +32,7 @@ export default class RelationExtractorAnnotator extends Annotator {
         new MorphaAnnotator(),
         new NERClassifierCombiner(),
         new DependencyParseAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/ssplit.js b/src/simple/annotator/ssplit.js
index e7372fb..53722db 100644
--- a/src/simple/annotator/ssplit.js
+++ b/src/simple/annotator/ssplit.js
@@ -31,7 +31,7 @@ export default class WordsToSentenceAnnotator extends Annotator {
       },
       [
         new TokenizerAnnotator(),
-      ],
+      ]
     );
   }
 }
diff --git a/src/simple/annotator/tokenize.js b/src/simple/annotator/tokenize.js
index 8eb31b0..9f4fea5 100644
--- a/src/simple/annotator/tokenize.js
+++ b/src/simple/annotator/tokenize.js
@@ -24,7 +24,7 @@ export default class TokenizerAnnotator extends Annotator {
         // options: null, // throws error on CoreNLP server
         verbose: false,
         ...options,
-      },
+      }
     );
   }
 }
diff --git a/src/simple/document.js b/src/simple/document.js
index 5900679..f96a94d 100644
--- a/src/simple/document.js
+++ b/src/simple/document.js
@@ -10,12 +10,14 @@ import Sentence from './sentence';
  */
 
 /**
- * Class representing a Document (@see CoreNLP.Document).
+ * @class
+ * @classdesc Class representing a Document
  * @extends Annotable
  */
 export default class Document extends Annotable {
   /**
    * Create a Document
+   * @memberof Document
    * @param {string} text
    */
   constructor(text) {
@@ -25,7 +27,7 @@ export default class Document extends Annotable {
 
   /**
    * Get a string representation
-   * @return {string} document
+   * @returns {string} document
    */
   toString() {
     return this._text || this._sentences.map(sent => sent.toString()).join('. ');
diff --git a/src/simple/governor.spec.js b/src/simple/governor.spec.js
index e6fa7ae..dbe8a0d 100644
--- a/src/simple/governor.spec.js
+++ b/src/simple/governor.spec.js
@@ -7,7 +7,7 @@ describe('Governor', () => {
   beforeEach(() => {
     governor = new Governor('det',
       new Token('él'),
-      new Token('pájaro'),
+      new Token('pájaro')
     );
   });