protected virtual void InstallPatch(IPatch patch)
 {
     try
     {
         patch.Patch(this);
     }
     catch (Exception e) when(!(e is InstallException))
     {
         throw new InstallException("failed to install " + patch.PatchName, e);
     }
 }