code: function Binding(properties) {
    if (!properties.node || !properties.view) {
      throw new TypeError('A binding must receive a node and a view');
    }
  
    // element and node are aliases
    this._elementPath = initNodePath(properties.node, properties.view);
    this.node = properties.node;
    this.element = properties.node;
    this.name = properties.name;
    this.match = properties.match;
    this.expression = properties.expression;
    this.fragments = properties.fragments;
    this.observations = properties.fragments.observations;
    this.context = null;
  }
docs: A binding is a link between an element and some data. Subclasses of Binding called binders define what a binding does
  with that link. Instances of these binders are created as bindings on templates. When a view is stamped out from the
  template the binding is "cloned" (it is actually extended for performance) and the `element`/`node` property is
  updated to the matching element in the view.
  
  ### Properties
  * element: The element (or text node) this binding is bound to
  * node: Alias of element, since bindings may apply to text nodes this is more accurate
  * name: The attribute or element name (does not apply to matched text nodes)
  * match: The matched part of the name for wildcard attributes (e.g. `on-*` matching against `on-click` would have a
  match property equalling `click`). Use `this.camelCase` to get the match proerty camelCased.
  * expression: The expression this binding will use for its updates (does not apply to matched elements)
  * context: The context the exression operates within when bound