docs: function (name, value) {
        var self = this;
        if (value !== undef) {
          var match = /^(\W*)(.*)/.exec(replace(replace(name, /^\$float$/, 'cssFloat'), /^%/,'@data-'));
          var prefix = match[1];
  
          if (setter[prefix])
            setter[prefix](this, match[2], value);
          else if (name == '$$fade') {
            this['set']({'$visibility': value ? 'visible' : 'hidden', '$opacity': value});
          }
          else if (name == '$$slide') {
            self['set']({'$visibility': value ? 'visible' : 'hidden', '$overflow': 'hidden',
              '$height': /px/.test(value) ? value : function(oldValue, idx, element) { return getNaturalHeight($(element), value);}
            });
          }
          else if (name == '$$show') {
            if (value)
              self['set']({'$visibility': value ? 'visible' : 'hidden', '$display': ''}) // that value? part is only for gzip
                ['set']({'$display': function(oldVal) {                                // set for 2nd time: now we get the stylesheet's $display
                return oldVal == 'none' ? 'block' : oldVal;
              }});
            else
              self['set']({'$display': 'none'});
          }
          else if (name == '$$') {
            self['set']('@style', value);
          }
          else
            flexiEach(this, function(obj, c) {
              var newValue = isFunction(value) ? value($(obj)['get'](name), c, obj) : value;
              if (prefix == '$') {
                if (match[2])
                  obj['style'][match[2]] = newValue;
                else {
                  flexiEach(newValue && newValue.split(/\s+/), function(clzz) {
                    var cName = replace(clzz, /^[+-]/);
  
                    if (/^\+/.test(clzz))
                      obj['classList'].add(cName);
                    else if (/^-/.test(clzz))
                      obj['classList'].remove(cName);
                    else
                      obj['classList'].toggle(cName);
                  });
                }
              }
              else if (name == '$$scrollX')
                obj['scroll'](newValue, $(obj)['get']('$$scrollY'));
              else if (name == '$$scrollY')
                obj['scroll']($(obj)['get']('$$scrollX'), newValue);
              else if (prefix == '@') {
                if (newValue == _null)
                  obj.removeAttribute(match[2]);
                else
                  obj.setAttribute(match[2], newValue);
              }
              else
                obj[match[2]] = newValue;
            });
        }
        else if (isString(name) || isFunction(name))
          self['set']('$', name);
        else
          eachObj(name, function(n,v) { self['set'](n, v); });
        return self;
      }