| 
						
						
							
								
							
						
						
					 | 
					@ -17,6 +17,14 @@ class ServiceRegistryPrivate; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					class Q_MVVMCORE_EXPORT ServiceRegistry | 
					 | 
					 | 
					class Q_MVVMCORE_EXPORT ServiceRegistry | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					public: | 
					 | 
					 | 
					public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
						enum DestructionScope { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
							DestroyOnAppQuit = 1, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
							DestroyOnAppDestroy = 2, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
							DestroyOnRegistryDestroy = 3, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
							DestroyNever = 127 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
						}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						//! @private
 | 
					 | 
					 | 
						//! @private
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						ServiceRegistry(ServiceRegistryPrivate *d_ptr); | 
					 | 
					 | 
						ServiceRegistry(ServiceRegistryPrivate *d_ptr); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						~ServiceRegistry(); | 
					 | 
					 | 
						~ServiceRegistry(); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -32,32 +40,41 @@ public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service for its interface via the type
 | 
					 | 
					 | 
						//! Register a service for its interface via the type
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TInterface, typename TService> | 
					 | 
					 | 
						template <typename TInterface, typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerInterface(bool weak = false); | 
					 | 
					 | 
						void registerInterface(bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service for its interface via a constructor function
 | 
					 | 
					 | 
						//! Register a service for its interface via a constructor function
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TInterface, typename TService, typename TFunc> | 
					 | 
					 | 
						template <typename TInterface, typename TService, typename TFunc> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerInterface(TFunc fn, bool weak = false); | 
					 | 
					 | 
						void registerInterface(TFunc fn, bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service for its interface via an already existing instance
 | 
					 | 
					 | 
						//! Register a service for its interface via an already existing instance
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TInterface, typename TService> | 
					 | 
					 | 
						template <typename TInterface, typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerInterface(TService *service, bool weak = false); | 
					 | 
					 | 
						void registerInterface(TService *service, bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service via its type
 | 
					 | 
					 | 
						//! Register a service via its type
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TService> | 
					 | 
					 | 
						template <typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerObject(bool weak = false); | 
					 | 
					 | 
						void registerObject(bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service via a constructor function
 | 
					 | 
					 | 
						//! Register a service via a constructor function
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TService, typename TFunc> | 
					 | 
					 | 
						template <typename TService, typename TFunc> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerObject(TFunc fn, bool weak = false); | 
					 | 
					 | 
						void registerObject(TFunc fn, bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service via an already existing instance
 | 
					 | 
					 | 
						//! Register a service via an already existing instance
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TService> | 
					 | 
					 | 
						template <typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						void registerObject(TService *service, bool weak = false); | 
					 | 
					 | 
						void registerObject(TService *service, bool weak = false, DestructionScope scope = DestroyOnAppDestroy); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service by an iid via their metadata
 | 
					 | 
					 | 
						//! Register a service by an iid via their metadata
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
											 const QMetaObject *metaObject, | 
					 | 
					 | 
											 const QMetaObject *metaObject, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
											 bool weak = false); | 
					 | 
					 | 
											 bool weak, | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 DestructionScope scope); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 const QMetaObject *metaObject, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 bool weak = false); //MAJOR merge methods
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						//! Register a service by an iid via a generalized constructor function
 | 
					 | 
					 | 
						//! Register a service by an iid via a generalized constructor function
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
											 const std::function<QObject*(const QObjectList &)> &fn, | 
					 | 
					 | 
											 const std::function<QObject*(const QObjectList &)> &fn, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
											 QByteArrayList injectables, | 
					 | 
					 | 
											 QByteArrayList injectables, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
											 bool weak = false); | 
					 | 
					 | 
											 bool weak, | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 DestructionScope scope); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
						void registerService(const QByteArray &iid, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 const std::function<QObject*(const QObjectList &)> &fn, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 QByteArrayList injectables, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
											 bool weak = false);//MAJOR merge methods
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						//! Returns the service for the given interface
 | 
					 | 
					 | 
						//! Returns the service for the given interface
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						template <typename TInterface> | 
					 | 
					 | 
						template <typename TInterface> | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -152,29 +169,29 @@ bool ServiceRegistry::isRegistered() const | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						Q_ASSERT_X(qobject_interface_iid<TInterface*>(), Q_FUNC_INFO, "TInterface must be registered with Q_DECLARE_INTERFACE"); | 
					 | 
					 | 
						Q_ASSERT_X(qobject_interface_iid<TInterface*>(), Q_FUNC_INFO, "TInterface must be registered with Q_DECLARE_INTERFACE"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template<typename TInterface, typename TService> | 
					 | 
					 | 
					template<typename TInterface, typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerInterface(bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerInterface(bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), &TService::staticMetaObject, weak); | 
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), &TService::staticMetaObject, weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template <typename TInterface, typename TService, typename TFunc> | 
					 | 
					 | 
					template <typename TInterface, typename TService, typename TFunc> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerInterface(TFunc fn, bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerInterface(TFunc fn, bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QByteArrayList injectables; | 
					 | 
					 | 
						QByteArrayList injectables; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						auto packed_fn = __helpertypes::pack_function(std::move(fn), injectables); | 
					 | 
					 | 
						auto packed_fn = __helpertypes::pack_function(std::move(fn), injectables); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), packed_fn, injectables, weak); | 
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), packed_fn, injectables, weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template<typename TInterface, typename TService> | 
					 | 
					 | 
					template<typename TInterface, typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerInterface(TService *service, bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerInterface(TService *service, bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TInterface, TService) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), [service](const QObjectList ¶ms) -> QObject* { | 
					 | 
					 | 
						registerService(qobject_interface_iid<TInterface*>(), [service](const QObjectList ¶ms) -> QObject* { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
							Q_UNUSED(params); | 
					 | 
					 | 
							Q_UNUSED(params); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
							return service; | 
					 | 
					 | 
							return service; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						}, QByteArrayList(), weak); | 
					 | 
					 | 
						}, QByteArrayList(), weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#undef QTMVVM_SERVICE_ASSERT | 
					 | 
					 | 
					#undef QTMVVM_SERVICE_ASSERT | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -182,29 +199,29 @@ void ServiceRegistry::registerInterface(TService *service, bool weak) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						static_assert(__helpertypes::is_qobj<tsvc>::value, "TService must be a qobject class"); | 
					 | 
					 | 
						static_assert(__helpertypes::is_qobj<tsvc>::value, "TService must be a qobject class"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template<typename TService> | 
					 | 
					 | 
					template<typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerObject(bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerObject(bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), &TService::staticMetaObject, weak); | 
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), &TService::staticMetaObject, weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template<typename TService, typename TFunc> | 
					 | 
					 | 
					template<typename TService, typename TFunc> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerObject(TFunc fn, bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerObject(TFunc fn, bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QByteArrayList injectables; | 
					 | 
					 | 
						QByteArrayList injectables; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						auto packed_fn = __helpertypes::pack_function(std::move(fn), injectables); | 
					 | 
					 | 
						auto packed_fn = __helpertypes::pack_function(std::move(fn), injectables); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), packed_fn, injectables, weak); | 
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), packed_fn, injectables, weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					template<typename TService> | 
					 | 
					 | 
					template<typename TService> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void ServiceRegistry::registerObject(TService *service, bool weak) | 
					 | 
					 | 
					void ServiceRegistry::registerObject(TService *service, bool weak, DestructionScope scope) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
					 | 
					 | 
						QTMVVM_SERVICE_ASSERT(TService) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), [service](const QObjectList ¶ms) -> QObject* { | 
					 | 
					 | 
						registerService(__helpertypes::qobject_iid<TService*>(), [service](const QObjectList ¶ms) -> QObject* { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
							Q_UNUSED(params); | 
					 | 
					 | 
							Q_UNUSED(params); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
							return service; | 
					 | 
					 | 
							return service; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
						}, QByteArrayList(), weak); | 
					 | 
					 | 
						}, QByteArrayList(), weak, scope); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#undef QTMVVM_SERVICE_ASSERT | 
					 | 
					 | 
					#undef QTMVVM_SERVICE_ASSERT | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |