internal static IEnumerable <string> ValidationErrors(this IValidatableConfigurationSetting o)
        {
            foreach (var validationError in o.Validate())
            {
                yield return(validationError);
            }

            var settingType = o.GetType();
            var properties  = settingType
                              .GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
                              .Where(p => typeof(IValidatableConfigurationSetting).IsAssignableFrom(p.PropertyType))
                              .ToArray();

            foreach (var prop in properties)
            {
                var value = (IValidatableConfigurationSetting)prop.GetValue(o);
                if (value == null)
                {
                    yield return("Property {0} of {1} has not been provided.".FormatWith(prop.Name, settingType.Name));

                    continue;
                }

                foreach (var childValidationMessage in value.ValidationErrors())
                {
                    yield return(childValidationMessage);
                }
            }
        }
        internal static void AssertConfigurationIsValid(this IValidatableConfigurationSetting configuration)
        {
            var validationErrors = configuration.ValidationErrors().ToArray();

            if (validationErrors.None())
            {
                return;
            }

            var message = string.Join(Environment.NewLine, new[] { "Bus configuration is invalid:" }.Concat(validationErrors));

            throw new BusException(message);
        }