public void Run(Assembly assembly, IEnumerable<Context> contexts)
    {
      bool hasExecutableSpecifications = contexts.Where(x => x.HasExecutableSpecifications).Any();

      var explorer = new AssemblyExplorer();
      var assemblyContexts = new List<IAssemblyContext>(explorer.FindAssemblyContextsIn(assembly));

      _listener.OnAssemblyStart(assembly.GetInfo());

      var executedAssemblyContexts = new List<IAssemblyContext>();

      try
      {
        if (hasExecutableSpecifications)
        {
          assemblyContexts.ForEach(assemblyContext =>
          {
            assemblyContext.OnAssemblyStart();
            executedAssemblyContexts.Add(assemblyContext);
          });
        }

        foreach (var context in contexts)
        {
          RunContext(context);
        }
      }
      catch (Exception err)
      {
        _listener.OnFatalError(new ExceptionResult(err));
      }
      finally
      {
        if (hasExecutableSpecifications)
        {
          try
          {
            executedAssemblyContexts.Reverse();
            executedAssemblyContexts.ForEach(assemblyContext => assemblyContext.OnAssemblyComplete());
          }
          catch (Exception err)
          {
            _listener.OnFatalError(new ExceptionResult(err));
            throw;
          }
        }
      }

      _listener.OnAssemblyEnd(assembly.GetInfo());
    }
 void OnAssemblyEnd(Assembly assembly)
 {
   try
   {
     _listener.OnAssemblyEnd(assembly.GetInfo());
   }
   catch (Exception err)
   {
     _listener.OnFatalError(new ExceptionResult(err));
   }
 }
        void OnAssemblyStart(Assembly assembly)
        {
            try
            {
                _listener.OnAssemblyStart(assembly.GetInfo());

                IEnumerable<IAssemblyContext> assemblyContexts = _explorer.FindAssemblyContextsIn(assembly);
                assemblyContexts.Each(assemblyContext =>
                {
                    assemblyContext.OnAssemblyStart();
                    _executedAssemblyContexts.Add(assemblyContext);
                });
            }
            catch (Exception err)
            {
                _listener.OnFatalError(new ExceptionResult(err));
            }
        }
        void OnAssemblyEnd(Assembly assembly)
        {
            try
            {
                _listener.OnAssemblyEnd(assembly.GetInfo());
                _executedAssemblyContexts
                    .Reverse()
                    .Each(assemblyContext => assemblyContext.OnAssemblyComplete());

            }
            catch (Exception err)
            {
                _listener.OnFatalError(new ExceptionResult(err));
            }
        }