RetCode BOSS_CALL ServiceRegistry::AddService(IServiceInfo *service)
 {
   try
   {
     std::lock_guard<std::recursive_mutex> Lock(Mtx);
     if (!service)
       return Status::InvalidArgument;
     IServiceInfoPtr Info(service);
     ServiceId SrvId = 0;
     RetCode Res = Info->GetServiceId(&SrvId);
     if (Res != Status::Ok)
       return Res;
     RefObjPtr<IEnum> ClassIdsEnum;
     Res = Info->GetClassIds(ClassIdsEnum.GetPPtr());
     if (Res != Status::Ok)
       return Res;
     typedef std::vector<ClassId> ClassIdPool;
     ClassIdPool ClassIds;
     if (ClassIdsEnum->Reset() != Status::Ok)
       return Status::Fail;
     for (RefObjPtr<IBase> i ; ClassIdsEnum->Next(i.GetPPtr()) == Status::Ok ; i.Release())
     {
       RefObjQIPtr<IEntityId> Id(i);
       if (!Id.Get())
         return Status::Fail;
       ClassId ClsId = 0;
       Res = Id->GetId(&ClsId);
       if (Res != Status::Ok)
         return Res;
       if (Services.find(ClsId) != std::end(Services))
         return Status::Fail;
       ClassIds.push_back(ClsId);
     }
     auto Pred = [&] (decltype(*ServicePool::const_iterator()) &info)
       {
         ServiceId Id = 0;
         return info.second->GetServiceId(&Id) == Status::Ok && Id == SrvId;
       };
     auto Iter = std::find_if(std::begin(Services), std::end(Services), Pred);
     if (Iter != std::end(Services))
       return Status::AlreadyExists;
     for (auto const &i : ClassIds)
       Services[i] = Info;
   }
   catch (...)
   {
     return Status::Fail;
   }
   return Status::Ok;
 }