private ComponentLifecycleExtension GetDynamicParametersExtension(ComponentModel model)
		{
			if (model.ExtendedProperties.Contains(key))
			{
				return (ComponentLifecycleExtension)model.ExtendedProperties[key];
			}

			var dynamicParameters = new ComponentLifecycleExtension();
			model.ExtendedProperties[key] = dynamicParameters;
			model.ResolveExtensions(true).Add(dynamicParameters);
			return dynamicParameters;
		}
		private IHandler CreateHandler(ComponentModel model)
		{
			if (model.RequiresGenericArguments)
			{
				return new DefaultGenericHandler(model);
			}
			var resolveExtensions = model.ResolveExtensions(false);
			var releaseExtensions = model.ReleaseExtensions(false);
			if (releaseExtensions == null && resolveExtensions == null)
			{
				return new DefaultHandler(model);
			}
			return new ExtendedHandler(model, resolveExtensions, releaseExtensions);
		}
		private IHandler CreateHandler(ComponentModel model)
		{
			if (model.RequiresGenericArguments)
			{
				var matchingStrategy = GenericImplementationMatchingStrategy(model);
				return new DefaultGenericHandler(model, matchingStrategy);
			}
			var resolveExtensions = model.ResolveExtensions(false);
			var releaseExtensions = model.ReleaseExtensions(false);
			if (releaseExtensions == null && resolveExtensions == null)
			{
				return new DefaultHandler(model);
			}
			return new ExtendedHandler(model, resolveExtensions, releaseExtensions);
		}
		private IHandler CreateHandler(ComponentModel model)
		{
			if (model.RequiresGenericArguments)
			{
				var matchingStrategy = GenericImplementationMatchingStrategy(model);
				var serviceStrategy = GenericServiceStrategy(model);
				return new DefaultGenericHandler(model, matchingStrategy, serviceStrategy);
			}

			// meta descriptors only apply to open generic handlers so we cam safely let go of them, save some memory
			ComponentModelDescriptorUtil.RemoveMetaDescriptors(model);

			var resolveExtensions = model.ResolveExtensions(false);
			var releaseExtensions = model.ReleaseExtensions(false);
			if (releaseExtensions == null && resolveExtensions == null)
			{
				return new DefaultHandler(model);
			}
			return new ExtendedHandler(model, resolveExtensions, releaseExtensions);
		}