/// <summary>
        /// Adds all sagas in the specified assemblies matching the namespace. If you are using both state machine and regular sagas, be
        /// sure to call AddSagaStateMachinesFromNamespaceContaining prior to calling this one.
        /// </summary>
        /// <param name="configurator"></param>
        /// <param name="type">The type to use to identify the assembly and namespace to scan</param>
        /// <param name="filter"></param>
        public static void AddSagasFromNamespaceContaining(this IRegistrationConfigurator configurator, Type type, Func <Type, bool> filter = null)
        {
            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (type.Assembly == null || type.Namespace == null)
            {
                throw new ArgumentException($"The type {TypeMetadataCache.GetShortName(type)} is not in an assembly with a valid namespace", nameof(type));
            }

            IEnumerable <Type> types;

            if (filter != null)
            {
                bool IsAllowed(Type candidate)
                {
                    return(TypeMetadataCache.IsSagaOrDefinition(candidate) && filter(candidate));
                }

                types = FindTypesInNamespace(type, IsAllowed);
            }
            else
            {
                types = FindTypesInNamespace(type, TypeMetadataCache.IsSagaOrDefinition);
            }

            AddSagas(configurator, types.ToArray());
        }