code: function(o, callback) {
        if (!o) return callback('details(): parameter o NOT FOUND.');
        if (!o.titles) return callback('details(): o.titles NOT FOUND.');
        var p = {};
        p.titles = _.slice(o.titles, 0, 20);
        var len = p.titles.length;
        p.prop = {
          extracts: {
            exlimit: len,
            exchars: (o.abstracts ? o.abstracts : undefined)
          },
          pageimages: {
            pilimit: len,
            pithumbsize: (o.size || 200)
          }
        };
        var url = this.url; 
        if (!url || !callback) return mwapi.query(p);
        mwapi.query(p, url, function(err, data) {
          if (err) return callback(err);
          var pageids = data.query.pageids;
          if (_.isEqual(pageids, [ '-1' ])) {
            return callback('', []);
          } else {
            var ret = _.map(pageids, function(id) {
              return data.query.pages[id];
            });
            return callback('', ret);
          }
        });
      }
docs: /*
  Get detail information about pages with the given titles
  
  Will call MWAPI.query(), prop, extracts|pageimages.
  
  Parameter *o*, required, defined as {
  titles, required, array of titles of pages queried, should not be
  longer than 20 because prop=extracts does not support,
  abstracts, optional, length of abstracts returned. If not set, will
  return intro information of the pages (using exintro in prop=extracts)
  size, optional, size of thumbnails, 200 by default
  }
  
  *callback*(err, data)
  
  Return array of such objects, {
  pageid,
  title,
  extract,
  thumbnail {
  source, url of thumbnail,
  width,
  height
  },
  pageimage, filename of thumbnail,
  }