docs: function addListener(attr,func,child,update)
          {
            if(typeof func !== 'function') return bind;
  
            var isInput = (['value','checked'].indexOf(attr) !== -1),
                isStyle = (_allStyles.indexOf(attr) !== -1),
                listeners;
  
            if(this.toString() !== bind.toString())
            {
              if(child)
              {
                var children = this.querySelectorAll('*'),
                    len = children.length,
                    listenerObj;
                for(var x=0;x<len;x++)
                {
                  listenerObj = children[x].attrListeners();
                  if(isInput || (attr === _all))
                  {
                    if(children[x].addInputBinding !== undefined) children[x].addInputBinding();
                    if(children[x].addInputBoxBinding !== undefined) children[x].addInputBoxBinding();
                  }
                  if(isStyle)
                  {
                    bind.injectStyleProperty(children[x],attr);
                    listeners = (update ? '_parentStyleUpdateListeners' : '_parentStyleListeners');
                    if(listenerObj[listeners][attr] === undefined) listenerObj[listeners][attr] = [];
                    listenerObj[listeners][attr].push({parent:this,func:func});
                  }
                  else
                  {
                    if(attr === _all)
                    {
                      listeners = (update ? '_parentStyleUpdateListeners' : '_parentStyleListeners');
                      var len = _allStyles.length;
                      for(var i = 0;i<len;i++)
                      {
                        bind.injectStyleProperty(children[x],_allStyles[i]);
                      }
                      if(listenerObj[listeners][_all] === undefined) listenerObj[listeners][_all] = [];
                        listenerObj[listeners][_all].push({parent:this,func:func});
                    }
                    listeners = (update ? '_parentAttrUpdateListeners' : '_parentAttrListeners');
                    if(listenerObj[listeners][attr] === undefined) listenerObj[listeners][attr] = [];
                    listenerObj[listeners][attr].push({parent:this,func:func});
                  }
                }
              }
              else
              {
                listenerObj = this.attrListeners();
                if(isStyle)
                {
                  listeners = (update ? '_styleUpdateListeners' : '_styleListeners');
                  bind.injectStyleProperty(this,attr);
                  if(listenerObj[listeners][attr] === undefined) listenerObj[listeners][attr] = [];
                  listenerObj[listeners][attr].push(func);
                }
                else
                {
                  if(isInput || (attr === _all))
                  {
                    if(this.addInputBinding !== undefined) this.addInputBinding();
                    if(this.addInputBoxBinding !== undefined) this.addInputBoxBinding();
                  }
                  if(attr === _all)
                  {
                    listeners = (update ? '_styleUpdateListeners' : '_styleListeners');
                    var len = _allStyles.length;
                    for(var x = 0;x<len;x++)
                    {
                      bind.injectStyleProperty(this,_allStyles[x]);
                    }
                    if(listenerObj[listeners][attr] === undefined) listenerObj[listeners][attr] = [];
                    listenerObj[listeners][attr].push(func);
                  }
                  listeners = (update ? '_attrUpdateListeners' : '_attrListeners');
                  if(listenerObj[listeners][attr] === undefined) listenerObj[listeners][attr] = [];
                  listenerObj[listeners][attr].push(func);
                }
              }
            }
            else
            {
              if(isInput || (attr === _all))
              {
                var inputs = document.querySelectorAll('input, textarea'),
                    len = inputs.length;
                for(var x=0;x<len;x++)
                {
                  if(inputs[x].addInputBinding !== undefined) inputs[x].addInputBinding();
                  if(inputs[x].addInputBoxBinding !== undefined) inputs[x].addInputBoxBinding();
                }
              }
              if(isStyle)
              {
                var els = Array.prototype.slice.call(document.body.querySelectorAll('*')),
                    len = (els.length+1);
                els.unshift(document.body);
                for(var x=0;x<len;x++)
                {
                  bind.injectStyleProperty(els[x],attr);
                }
                listeners = (update ? _styleUpdateListeners : _styleListeners);
                if(listeners[attr] === undefined) listeners[attr] = [];
                listeners[attr].push(func);
              }
              else
              {
                if(attr === _all)
                {
                  var els = Array.prototype.slice.call(document.body.querySelectorAll('*')),
                      len = (els.length+1),
                      lenStyles = _allStyles.length;
                  els.unshift(document.body);
                  for(var x=0;x<len;x++)
                  {
                    for(var i=0;i<lenStyles;i++)
                    {
                      bind.injectStyleProperty(els[x],_allStyles[i]);
                    }
                  }
                  listeners = (update ? _styleUpdateListeners : _styleListeners);
                  if(listeners[attr] === undefined) listeners[attr] = [];
                  listeners[attr].push(func);
                }
                listeners = (update ? _attrUpdateListeners : _attrListeners);
                if(listeners[attr] === undefined) listeners[attr] = [];
                listeners[attr].push(func);
              }
            }
          }