protected function composerFrameworkInstall ($package) {
		$extra = $package->getExtra();

		// recursively copy the contents of the install directory, providing each file is not there.
		$strInstallDir = self::NormalizeNonPosixPath($this->getPackageBasePath($package)) . '/install/project';
		$strDestDir = ($this->vendorDir ? $this->vendorDir . '/' : '') . '../project'; // try to find the default project location
		$strDestDir = self::NormalizeNonPosixPath($strDestDir);

		$this->io->write('Copying files from ' . $strInstallDir . ' to ' . $strDestDir);
		self::copy_dir($strInstallDir, $strDestDir);

		// Make sure particular directories are writable by the web server. These are listed in the extra section of the composer.json file.
		// We are assuming that the first time installation is installed in a subdirectory of docroot.
		$strInstallDir = self::NormalizeNonPosixPath(realpath(dirname($strDestDir)));
		$strSubDirectory = '/' . basename($strInstallDir);
		$strDocRoot = self::NormalizeNonPosixPath(realpath($strInstallDir . '/../'));
		$strConfigDirectory = $strDestDir . '/includes/configuration';

		$this->io->write('Updating permissions');
		foreach ($extra['writePermission'] as $strDir) {
			$strTargetDir = $strInstallDir . '/' . $strDir;
			if(!file_exists($strTargetDir)){
				mkdir($strTargetDir, 0777, true);
			}
			chmod ($strTargetDir, 0777);
		}

		// write configuration.inc.php only if it does not exists
		if (!file_exists($strConfigDirectory . '/configuration.inc.php')) {
			// fix up the configuration file
			$strFile = file_get_contents($strConfigDirectory . '/configuration.inc.sample.php');
			if ($strFile) {
				$strFile = str_replace (['{docroot}', '{vd}', '{subdir}'], [$strDocRoot, '', $strSubDirectory], $strFile);
				file_put_contents($strConfigDirectory . '/configuration.inc.php', $strFile);
			}
		}
	}