/// <summary>
        /// Extends a model element with the corresponding ObjectExtender based of the ExtenderProvider.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="value">The value.</param>
        protected virtual void ExtendModelElements(ITypeDescriptorContext context, object value)
        {
            ModelElement rootElement = context.Instance as ModelElement;

            if (rootElement == null)
            {
                return;
            }

            IList <ModelElement> extensibleObjects = new List <ModelElement>();
            ElementWalker        walker            = new DepthFirstElementWalker(
                new TypeMatchingElementVisitor <IExtensibleObject>(extensibleObjects),
                new EmbeddingVisitorFilter()
                );

            walker.DoTraverse(rootElement);

            if (extensibleObjects.Count > 0)
            {
                using (Transaction transaction = rootElement.Store.TransactionManager.BeginTransaction())
                {
                    foreach (ModelElement mel in extensibleObjects)
                    {
                        ProvideObjectExtender(mel, mel as IExtensibleObject, value as IExtensionProvider);
                    }

                    transaction.Commit();
                }
            }
        }
		public void ShouldReturnEmptyListIfNoMatches()
		{
			List<ModelElement> elementList = new List<ModelElement>();

			Store store = new Store(new Type[] { typeof(MockDomainModel) });
			Partition partition = new Partition(store);
			using (Transaction t = store.TransactionManager.BeginTransaction())
			{
				UnextendedMockModelElement unextendedModelElement = new UnextendedMockModelElement(partition);

				DepthFirstElementWalker elementWalker = new DepthFirstElementWalker(
					new TypeMatchingElementVisitor<IExtensibleObject>(elementList),
					new EmbeddingVisitorFilter()
					);

				elementWalker.DoTraverse(unextendedModelElement);
				t.Rollback();

				Assert.AreEqual<int>(0, elementList.Count);
			}
		}
		public void ShouldAddElementThatMatchType()
		{
			List<ModelElement> elementList = new List<ModelElement>();

			Store store = new Store(new Type[] { typeof(MockDomainModel) });
			Partition partition = new Partition(store);
			using (Transaction t = store.TransactionManager.BeginTransaction())
			{
				ExtensibleMockModelElement myModelElement = new ExtensibleMockModelElement(partition, "TestMessage");

				DepthFirstElementWalker elementWalker = new DepthFirstElementWalker(
					new TypeMatchingElementVisitor<IExtensibleObject>(elementList),
					new EmbeddingVisitorFilter()
					);

				elementWalker.DoTraverse(myModelElement);
				t.Rollback();

				Assert.AreEqual<int>(1, elementList.Count);
			}
		}
        public void ShouldReturnEmptyListIfNoMatches()
        {
            List <ModelElement> elementList = new List <ModelElement>();

            Store     store     = new Store(new Type[] { typeof(MockDomainModel) });
            Partition partition = new Partition(store);

            using (Transaction t = store.TransactionManager.BeginTransaction())
            {
                UnextendedMockModelElement unextendedModelElement = new UnextendedMockModelElement(partition);

                DepthFirstElementWalker elementWalker = new DepthFirstElementWalker(
                    new TypeMatchingElementVisitor <IExtensibleObject>(elementList),
                    new EmbeddingVisitorFilter()
                    );

                elementWalker.DoTraverse(unextendedModelElement);
                t.Rollback();

                Assert.AreEqual <int>(0, elementList.Count);
            }
        }
        public void ShouldAddElementThatMatchType()
        {
            List <ModelElement> elementList = new List <ModelElement>();

            Store     store     = new Store(new Type[] { typeof(MockDomainModel) });
            Partition partition = new Partition(store);

            using (Transaction t = store.TransactionManager.BeginTransaction())
            {
                ExtensibleMockModelElement myModelElement = new ExtensibleMockModelElement(partition, "TestMessage");

                DepthFirstElementWalker elementWalker = new DepthFirstElementWalker(
                    new TypeMatchingElementVisitor <IExtensibleObject>(elementList),
                    new EmbeddingVisitorFilter()
                    );

                elementWalker.DoTraverse(myModelElement);
                t.Rollback();

                Assert.AreEqual <int>(1, elementList.Count);
            }
        }
		/// <summary>
		/// Extends a model element with the corresponding ObjectExtender based of the ExtenderProvider.
		/// </summary>
		/// <param name="context">The context.</param>
		/// <param name="value">The value.</param>
		protected virtual void ExtendModelElements(ITypeDescriptorContext context, object value)
		{
			ModelElement rootElement = context.Instance as ModelElement;
			if (rootElement == null)
			{
				return;
			}

			IList<ModelElement> extensibleObjects = new List<ModelElement>();
			ElementWalker walker = new DepthFirstElementWalker(
					new TypeMatchingElementVisitor<IExtensibleObject>(extensibleObjects),
					new EmbeddingVisitorFilter()
				);

			walker.DoTraverse(rootElement);

			if (extensibleObjects.Count > 0)
			{
				using (Transaction transaction = rootElement.Store.TransactionManager.BeginTransaction())
				{
					foreach (ModelElement mel in extensibleObjects)
					{
						ProvideObjectExtender(mel, mel as IExtensibleObject, value as IExtensionProvider);
					}

					transaction.Commit();
				}
			}
		}