/// <inheritdoc/>
        public void Perform()
        {
            _logger.Trace("Bootstrapper start all procedures");
            _executionContextManager.System(BootProceduresCorrelationId);
            var queue = new Queue <ICanPerformBootProcedure>(_procedures);

            _logger.Information($"Starting to perform {queue.Count} boot procedures");
            while (queue.Count > 0)
            {
                var procedure = queue.Dequeue();
                if (procedure.CanPerform())
                {
                    _logger.Information($"Performing boot procedure called '{procedure.GetType().AssemblyQualifiedName}'");
                    procedure.Perform();
                }
                else
                {
                    _logger.Information($"Re-enqueing boot procedure called '{procedure.GetType().AssemblyQualifiedName}'");
                    queue.Enqueue(procedure);
                }
            }
        }