docs: function (Vue) {
    var ref = Vue.util;
    var looseEqual = ref.looseEqual;
    var isPlainObject = ref.isPlainObject;
  
    function getValidatorProps (validators) {
      var normalized = typeof validators === 'string' ? [validators] : validators;
      var targets = [];
      if (isPlainObject(normalized)) {
        Object.keys(normalized).forEach(function (validator) {
          var props = (normalized[validator] &&
            normalized[validator]['props'] &&
            isPlainObject(normalized[validator]['props']))
              ? normalized[validator]['props']
              : null;
          if (props) {
            Object.keys(props).forEach(function (prop) {
              if (!~targets.indexOf(prop)) {
                targets.push(prop);
              }
            });
          }
        });
      }
      return targets
    }
  
    var ComponentElement = function ComponentElement (vm, vnode, validatorProps) {
      this._vm = vm;
      this._vnode = vnode;
      this._validatorProps = validatorProps || memoize(getValidatorProps);
      this.initValue = this.getValue();
      this._watchers = [];
      this.attachValidity();
    };
  
    ComponentElement.prototype.attachValidity = function attachValidity () {
      this._vm.$el.$validity = this._vm;
    };
  
    ComponentElement.prototype.getValidatorProps = function getValidatorProps$1 () {
      var vm = this._vm;
      return this._validatorProps(vm._uid.toString(), vm.validators)
    };
  
    ComponentElement.prototype.getValue = function getValue () {
        var this$1 = this;
  
      var value = {};
      this.getValidatorProps().forEach(function (prop) {
        value[prop] = this$1._vnode.child[prop];
      });
      return value
    };
  
    ComponentElement.prototype.checkModified = function checkModified () {
      return !looseEqual(this.initValue, this.getValue())
    };
  
    ComponentElement.prototype.listenToucheableEvent = function listenToucheableEvent () {
      this._vm.$el.addEventListener('focusout', this._vm.willUpdateTouched);
    };
  
    ComponentElement.prototype.unlistenToucheableEvent = function unlistenToucheableEvent () {
      this._vm.$el.removeEventListener('focusout', this._vm.willUpdateTouched);
    };
  
    ComponentElement.prototype.listenInputableEvent = function listenInputableEvent () {
        var this$1 = this;
  
      this.getValidatorProps().forEach(function (prop) {
        this$1._watchers.push(this$1._vnode.child.$watch(prop, this$1._vm.watchInputable));
      });
    };
  
    ComponentElement.prototype.unlistenInputableEvent = function unlistenInputableEvent () {
      this._watchers.forEach(function (watcher) { watcher(); });
      this._watchers = [];
    };
  
    return ComponentElement
  }