public override void ProcessModel(IKernel kernel, ComponentModel model)
		{
			if (_transactionalInfoStore == null)
			{
				_transactionalInfoStore = kernel.Resolve<ITransactionalInfoStore>();
			}

			var transactionalInfo = _transactionalInfoStore.GetTransactionalInfo(model.Implementation);
			if (transactionalInfo.TransactionalMethods.Length == 0)
			{
				return;
			}

			if (model.Implementation.IsSealed)
			{
				var sb = new StringBuilder();
				sb.AppendFormat("The class {0} uses [NHTransaction] attributes, but it is sealed", model.Implementation);
				throw new NHibernateFacilityException(sb.ToString());
			}

			var problemMethods = (from m in transactionalInfo.TransactionalMethods
			                      where !m.IsVirtual
			                      select m).ToArray();

			if (problemMethods.Length > 0)
			{
				var sb = new StringBuilder();
				sb.AppendFormat(
					"The class {0} uses [NHTransaction] attributes, but the following methods need to be declared virtual:",
					model.Implementation);
				sb.AppendLine();
				foreach (var m in problemMethods)
				{
					sb.Append("  ");
					sb.Append(m.Name);
				}
				throw new NHibernateFacilityException(sb.ToString());
			}

			model.Dependencies.Add(new DependencyModel(null, typeof (NHTransactionInterceptor), false));
			model.Interceptors.Add(new InterceptorReference(typeof (NHTransactionInterceptor)));
		}
		public NHTransactionInterceptor(IKernel kernel, ITransactionalInfoStore transactionalInfoStore)
		{
			_kernel = Verify.ArgumentNotNull(kernel, "kernel");
			_transactionalInfoStore = Verify.ArgumentNotNull(transactionalInfoStore, "transactionalInfoStore");
		}