docs: function getAnagrams( resources, opts, clbk ) {
  	var nargs = arguments.length,
  		isStr = isString( resources ),
  		hashes,
  		count,
  		parts,
  		lang,
  		done,
  		rsrc,
  		str,
  		len,
  		i;
  	if ( !isStr && !isStringArray( resources ) ) {
  		throw new TypeError( 'getAnagrams()::invalid input argument. Must provide either a string or a string array. Value: `' + resources + '`.' );
  	}
  	if ( nargs > 2 ) {
  		done = clbk;
  		if ( !isObject( opts ) ) {
  			throw new TypeError( 'getAnagrams()::invalid input argument. Options must be an object. Value: `' + opts + '`.' );
  		}
  		if ( opts.hasOwnProperty( 'lang' ) ) {
  			if ( !isString( opts.lang ) ) {
  				throw new TypeError( 'getAnagrams()::invalid option. Language option must be a string. Option: `' + opts.lang + '`.' );
  			}
  		}
  	} else {
  		done = opts;
  	}
  	if ( !isFunction( done ) ) {
  		throw new TypeError( 'getAnagrams()::invalid input argument. Callback argument must be a function. Value: `' + done + '`.' );
  	}
  	if ( isStr ) {
  		rsrc = [ resources ];
  	} else {
  		rsrc = resources;
  	}
  	len = rsrc.length;
  	hashes = new Array( len );
  	count = 0;
  	for ( i = 0; i < len; i++ ) {
  		lang = opts.lang || 'en';
  		str = rsrc[ i ];
  		if ( isURI( str ) ) {
  			parts = url.parse( str );
  			lang = parts.hostname.split( '.' )[ 0 ];
  			parts = parts.pathname.split( '/' );
  			str = parts[ parts.length-1 ];
  		}
  		wikipedia.from_api( str, lang, onResource( i, next ) );
  	}
  	return;
  
  	/**
  	* FUNCTION: next( error, hash, i )
  	*	Callback invoked after a page has been processed.
  	*
  	* @private
  	* @param {Object|null} error - error object
  	* @param {Object} hash - anagram hash
  	* @param {Number} i - page index
  	*/
  	function next( error, hash, i ) {
  		if ( error ) {
  			done( error );
  			return;
  		}
  		hashes[ i ] = hash;
  		if ( ++count === len ) {
  			done( null, hashes );
  		}
  	} // end FUNCTION next()
  }