docs: function elem(tagName) {
      if (!utils.isString(tagName)) {
          return null;
      }
  
      // element at the very least has name and fn to render itself
      var e = {
          tag: tagName
      };
  
      // add other values to the element based on the input argument
      if (arguments.length > 1) {
          for (var i = 1, len = arguments.length; i < len; ++i) {
              var arg = arguments[i];
  
              if (utils.isArray(arg)) {
                  if (e.children && e.children.length) {
                      e.children = e.children.concat(arg);
                  }
                  else {
                      e.children = arg;
                  }
              }
              else if (utils.isObject(arg) && arg.hasOwnProperty('tag')) {
                  e.children = e.children || [];
                  e.children.push(arg);
              }
              else if (utils.isObject(arg) && arg.tag && arg.toString) {
                  e.children = [arg];
              }
              else if (utils.isObject(arg)) {
                  e.attributes = arg;
              }
              else if (utils.isString(arg)) {
                  e.text = arg;
              }
          }
      }
  
      return e;
  }