/// <summary>
		/// Adds VirtualObjectType to the registry
		/// </summary>
		/// <param name="a_Object">
		/// Object to add <see cref="VirtualObjectType"/>
		/// </param>
		/// <remarks>
		/// If object by that name already exists exception is thrown
		/// </remarks>
		public static void Add (VirtualObjectType a_Object)
		{
			if (a_Object == null)
				return;
			if (ObjectByName(a_Object.Name) != null)
				throw new ExceptionDuplicateVirtualObjectRegistered (a_Object.Name);
			objects.Add (a_Object);
		}
		/// <summary>
		/// Creates and adds new VirtualObjectType to registry
		/// </summary>
		/// <param name="a_Name">
		/// Name of new virtual object <see cref="System.String"/>
		/// </param>
		/// <remarks>
		/// When it is used this way it has to be resolved after to get the object for this type
		/// </remarks>
		public static void Add (string a_Name)
		{
			VirtualObjectType obj = new VirtualObjectType (a_Name);
			Add (obj);
			obj = null;
		}
		/// <summary>
		/// Unlocks the object type 
		/// </summary>
		/// <param name="a_Object">
		/// Object type <see cref="VirtualObjectType"/>
		/// </param>
		public static void Unlock (VirtualObjectType a_Object)
		{
			if (a_Object == null)
				throw new ExceptionUnlockNullVirtualObject();
			a_Object.Unlock();
		}
		/// <summary>
		/// Removes VirtualObjectType from registry
		/// </summary>
		/// <param name="a_Object">
		/// Object type to remove <see cref="VirtualObjectType"/>
		/// </param>
		public static void Remove (VirtualObjectType a_Object)
		{
			if (a_Object == null)
				return;
//			if (ObjectByName(a_Object.Name) != null)
//				throw new Exception ("Duplicate object registered '" + a_Object.Name + "'");
			objects.Remove (a_Object);
		}