private function download($source) {
		if ($this->args->git) {
			$task = new Task\GitClone($source, $this->args->branch);
		} else {
			/* print newline only once */
			$done = false;
			$task = new Task\StreamFetch($source, function($bytes_pct) use(&$done) {
				if (!$done) {
					$this->info(" %3d%% [%s>%s] \r",
						floor($bytes_pct*100),
						str_repeat("=", round(50*$bytes_pct)),
						str_repeat(" ", round(50*(1-$bytes_pct)))
					);
					if ($bytes_pct == 1) {
						$done = true;
						$this->info("\n");
					}
				}
			});
		}
		$local = $task->run($this->verbosity());

		$this->cleanup[] = new Task\Cleanup($local);
		return $local;
	}