protected virtual bool VisitCollectionsBeforeSave(object entity, object id, object[] values, IType[] types, IEventSource source)
		{
			WrapVisitor visitor = new WrapVisitor(source);
			// substitutes into values by side-effect
			visitor.ProcessEntityPropertyValues(values, types);
			return visitor.SubstitutionRequired;
		}
		private bool WrapCollections(IEventSource session, IEntityPersister persister, IType[] types, object[] values)
		{
			if (persister.HasCollections)
			{
				// wrap up any new collections directly referenced by the object
				// or its components

				// NOTE: we need to do the wrap here even if its not "dirty",
				// because collections need wrapping but changes to _them_
				// don't dirty the container. Also, for versioned data, we
				// need to wrap before calling searchForDirtyCollections

				WrapVisitor visitor = new WrapVisitor(session);
				// substitutes into values by side-effect
				visitor.ProcessEntityPropertyValues(values, types);
				return visitor.SubstitutionRequired;
			}
			else
			{
				return false;
			}
		}