private static void BindManyToManySubelements(Mapping.Collection collection,
		                                              XmlNode manyToManyNode,
		                                              Mappings model)
		{
			// Bind the where
			XmlAttribute where = manyToManyNode.Attributes["where"];
			String whereCondition = where == null ? null : where.Value;
			collection.ManyToManyWhere = whereCondition;

			// Bind the order-by
			XmlAttribute order = manyToManyNode.Attributes["order-by"];
			String orderFragment = order == null ? null : order.Value;
			collection.ManyToManyOrdering = orderFragment;

			// Bind the filters
			if ((manyToManyNode.SelectSingleNode(HbmConstants.nsFilter, nsmgr) != null || whereCondition != null) &&
			    collection.FetchMode == FetchMode.Join &&
			    collection.Element.FetchMode != FetchMode.Join)
			{
				throw new MappingException(
					"many-to-many defining filter or where without join fetching " +
					"not valid within collection using join fetching [" + collection.Role + "]"
					);
			}
			foreach (XmlNode filterElement in manyToManyNode.SelectNodes(HbmConstants.nsFilter, nsmgr))
			{
				string name = XmlHelper.GetAttributeValue(filterElement, "name");
				string condition = filterElement.InnerText.Trim();
				if (StringHelper.IsEmpty(condition))
					condition = XmlHelper.GetAttributeValue(filterElement, "condition");
				if (StringHelper.IsEmpty(condition))
				{
					condition = model.GetFilterDefinition(name).DefaultFilterCondition;
				}
				if (condition == null)
				{
					throw new MappingException("no filter condition found for filter: " + name);
				}
				log.Debug(
					"Applying many-to-many filter [" + name +
					"] as [" + condition +
					"] to role [" + collection.Role + "]"
					);
				collection.AddManyToManyFilter(name, condition);
			}
		}
		private static void ParseFilter(XmlNode filterElement, IFilterable filterable, Mappings model)
		{
			string name = GetPropertyName(filterElement);
			string condition = filterElement.InnerText;
			if (condition == null || StringHelper.IsEmpty(condition.Trim()))
			{
				if (filterElement.Attributes != null)
				{
					XmlAttribute propertyNameNode = filterElement.Attributes["condition"];
					condition = (propertyNameNode == null) ? null : propertyNameNode.Value;
				}
			}

			//TODO: bad implementation, cos it depends upon ordering of mapping doc
			//      fixing this requires that Collection/PersistentClass gain access
			//      to the Mappings reference from Configuration (or the filterDefinitions
			//      map directly) sometime during Configuration.buildSessionFactory
			//      (after all the types/filter-defs are known and before building
			//      persisters).
			if (StringHelper.IsEmpty(condition))
			{
				condition = model.GetFilterDefinition(name).DefaultFilterCondition;
			}
			if (condition == null)
			{
				throw new MappingException("no filter condition found for filter: " + name);
			}
			log.Debug("Applying filter [" + name + "] as [" + condition + "]");
			filterable.AddFilter(name, condition);
		}