code: function getText(obj, why) {
    // TODO: links ignored for now, patched for types for
    var GENERATE_LINK = function(x) { return x + ' '; }
    return _.reduce(obj.children, function(text, elem) {
      if (_.isString(elem)) {
        return text += elem.trim() + ' ';
      } else if (_.isPlainObject(elem)) {
        switch(elem.name) {
          case 'para':
            return text += getText(elem, why) + '  \n';
          case 'ref':
            return text += GENERATE_LINK(getText(elem, why));
          case 'parameterlist':
          case 'simplesect':
            return text; // to be handled elsewhere
          case 'programlisting':
          case 'htmlonly':
            return text; // ignored
          // TODO: html doesn't seem to work for yuidoc, using markdown for now
          case 'itemizedlist':
            return text += '\n' + getText(elem, why) + '  \n  \n';
          case 'listitem':
            return text += '+ ' + getText(elem, why) + '\n';
          case 'bold':
            return text += '__' + getText(elem, why).trim() + '__ ';
          case 'ulink':
            return text += '[' + getText(elem, why).trim() + '](' + getAttr(elem, 'url').trim() + ') ';
          case 'image':
            // TODO: copy images over; hard coded for now
            var fn = getAttr(elem, 'name');
            return text += '  \n  \n![' + fn + '](' + xml2js.opts.imagedir + '/' + fn + ') ';
          case 'linebreak':
            return text += '  \n';
          case 'ndash':
            return text += '&ndash; ';
          default:
            // TODO: incomplete list of doxygen xsd implemented
            console.warn('NYI Unknown Object Type: ' + elem.name);
            return text;
            //throw new Error('NYI Unknown Object Type: ' + elem.name);
        }
      } else {
        throw new Error('NYI Unknown Type: ' + (typeof elem));
      }
    }, '').trim();
  }
docs: get (and flatten) the text of the given object