docs: function addDispatcher(dispatcher, events, transformer){
    if (!dispatcher || typeof dispatcher.addHandler != 'function')
    {
      /** @cut */ basis.dev.warn(namespace + '.addDispatcher(): First argument should have `addHandler` method');
      return;
    }
  
    if (typeof events == 'string')
      events = events.split(/\s+/);
  
    if (!Array.isArray(events))
    {
      /** @cut */ basis.dev.warn(namespace + '.addDispatcher(): Second argument should be a list of events');
      return;
    }
  
    if (typeof transformer != 'function')
    {
      /** @cut */ basis.dev.warn(namespace + '.addDispatcher(): Third argument should be a function');
      return;
    }
  
    dispatcher.addHandler({
      '*': function(event){
        if (events.indexOf(event.type) != -1)
        {
          var eventName = event.type;
          var selectorList = getSelectorList(eventName);
  
          selectorList.forEach(function(item){
            var data = transformer(event, item);
  
            if (data)
              track(data);
          });
        }
      }
    });
  
    return true;
  }