Object* ServiceLocator::GetService(const QString& key) { if (disposed) { return NULL; } KeyToServiceMapType::const_iterator iter = services.find(key); Object* service = NULL; if (iter != services.end()) { service = iter.value(); } else { // if we don't have a service in our cache then: // 1. check our local factory // 2. go to the registry // or 3. use the parent service IServiceLocator::Pointer factoryParent = WorkbenchServiceRegistry::GLOBAL_PARENT; if (parent) { factoryParent = new ParentLocator(parent, key); } if (factory) { service = factory->Create(key, factoryParent.GetPointer(), this); } if (!service) { Object::Pointer factoryService = WorkbenchServiceRegistry::GetRegistry()->GetService(key, factoryParent.GetPointer(), this); if (factoryService) { managedFactoryServices.push_back(factoryService); } service = factoryService.GetPointer(); } if (!service) { service = factoryParent->GetService(key); } else { this->RegisterService(key, service); } } return service; }