public function update($package_id, $initial_extra, $target_extra)
 {
     $io = $this->getIO();
     list($uninstall, $update, $install) = ArrayOps::arrayCircularDiffKey($initial_extra, $target_extra);
     if (!empty($uninstall)) {
         $this->uninstall($package_id, ArrayOps::arrayFilterByKey($uninstall, $initial_extra));
     }
     if (!empty($install)) {
         $this->install($package_id, ArrayOps::arrayFilterByKey($install, $target_extra));
     }
     foreach (ArrayOps::arrayFilterByKey($update, $target_extra) as $name => $config) {
         $io->write("~ Updating route {$name}...");
         $this->getPackageInstaller()->route()->get($name)->merge($config)->persist();
         $io->write("<info>done.</info>", false);
     }
 }
 private function packageUpdate($initial, $target)
 {
     // get initial package properties
     $initial_package_name = $initial->getPrettyName();
     $initial_package_path = $this->composer->getInstallationManager()->getInstallPath($initial);
     $initial_package_version = $initial->getPrettyVersion();
     // get target package properties
     $target_package_name = $target->getPrettyName();
     $target_package_path = $this->composer->getInstallationManager()->getInstallPath($target);
     $target_package_version = $target->getPrettyVersion();
     // get local installer
     $installer = $this->getPackageInstaller();
     // init packagemanager and update package, just in case
     $package_manager = new PackageManager($this->composer, $this->io, $initial_package_path, $installer);
     $package_id = $package_manager->update($initial_package_name, $initial_package_version, $target_package_name, $target_package_version);
     // map actions
     $initial_actions_map = Parser::parse($initial);
     $target_actions_map = Parser::parse($target);
     list($uninstall, $update, $install) = ArrayOps::arrayCircularDiffKey($initial_actions_map, $target_actions_map);
     foreach ($uninstall as $action => $extra) {
         $action_instance = new $action($this->composer, $this->io, $initial_package_path, $installer);
         $action_instance->uninstall($package_id, $extra);
     }
     foreach ($install as $action => $extra) {
         $action_instance = new $action($this->composer, $this->io, $target_package_path, $installer);
         $action_instance->install($package_id, $extra);
     }
     foreach ($update as $action => $extra) {
         $action_instance = new $action($this->composer, $this->io, $target_package_path, $installer);
         $action_instance->update($package_id, $this->initial_actions_map[$action], $extra);
     }
 }