docs: function buildTree (options, modules, optimise) {
  	var packageId = 1
  	  , optimise  = optimise === false ? false : true;
  
  	debug('start buildTree()');
  	debug('   optimise: %s', optimise);
  	debug('   count modules: %s', modules.length);
  
  /**
   * Find a module by is uniq id
   *
   * @param  {string} uid module uniq id
   * @return {Module}     A module object
   */
  	function findModule(uid) {
  		return _.find(modules, function(module) {return module.uid === uid} );
  	}
  
  /**
   * Build a module dependency tree
   *
   * @param  {string} fromUID Entry point module uniq id
   * @param  {DepNode|null} node parent DepNode
   * @return {DepNode}           A DepNode object (traversable as a DepNode tree)
   * @api public
   */
  	function builder(fromUID, node) {
  
  
  		debug('builder fromUID:%s',fromUID);
  
  		// Create a node (or use the provided one)
  		var node = node || new DepNode((packageId++).toString(), options);
  
  
  		// Get the entry point module object
  		var fromModule = findModule(fromUID);
  
  		// Add entry point to the module
  		node.addModule(fromModule);
  
  
  
  		debug('    fromModule.req.length:%s', fromModule.req.length);
  		// For each module dependency, add module to
  		// the node
  		_.each(fromModule.req, function(link) {
  			var module = findModule(link.uid);
  
  			// Duplicate : pass
  			if(node.hasModule(module.uid)) return;
  
  			if(link.async) {
  				debug('        Add async module (%s) to node %s', link.uid, node.id);
  				// Async : Create a child node
  				node.appendChild(builder(link.uid));
  			} else {
  				debug('        Add sync module (%s) to node %s', link.uid, node.id);
  				// Sync : add module
  				node.addModule(module);
  				builder(link.uid, node);
  			}
  		});
  		return node;
  	}
  
  	// Main recursive call
  	var tree = builder(modules[0].uid);
  
  	// Optimisation (see DepNode about optimisation)
  	if(optimise) tree.optimise();
  
  	return tree;
  
  }