anchor.diff:    TMARSEngineRegistry=class
     private
       FItems: TDictionary<string, TMARSEngine>;
  -    function GetCount: Integer;
  +    FCriticalSection: TCriticalSection;
     protected
       class var _Instance: TMARSEngineRegistry;
       class function GetInstance: TMARSEngineRegistry; static;
  -    function GetEngine(const AName: string): TMARSEngine;
  +    function GetCount: Integer; virtual;
  +    function GetEngine(const AName: string): TMARSEngine; virtual;
       class function GetDefaultEngine: TMARSEngine; static;
     public
       constructor Create; virtual;
       destructor Destroy; override;
   
  -    procedure RegisterEngine(const AEngine: TMARSEngine);
  -    procedure UnregisterEngine(const AEngine: TMARSEngine); overload;
  -    procedure UnregisterEngine(const AEngineName: string); overload;
  +    procedure RegisterEngine(const AEngine: TMARSEngine); virtual;
  +    procedure UnregisterEngine(const AEngine: TMARSEngine); overload; virtual;
  +    procedure UnregisterEngine(const AEngineName: string); overload; virtual;
  +
  +    procedure EnumerateEngines(const ADoSomething: TProc<string, TMARSEngine>); virtual;
   
       property Engine[const AName: string]: TMARSEngine read GetEngine; default;
   
  
positive.code:       LParametersSliceName := AName;
      Result.Parameters.CopyFrom(Parameters, LParametersSliceName);
  
      Applications.Add(
        TMARSURL.CombinePath([BasePath, ABasePath]).ToLower
        , Result
      );
    except
      Result.Free;
      raise
  
negative.code: procedure TMARSEngineRegistry.RegisterEngine(const AEngine: TMARSEngine);
  begin
    Assert(Assigned(AEngine));
  
    FCriticalSection.Enter;
    try
      FItems.AddOrSetValue(AEngine.Name, AEngine);
    finally
      FCriticalSection.Leave;
    end;
  end;
  
  procedure TMARSEngineRegistry.UnregisterEngine(const AEngine: TMARSEngine);
  begin
    Assert(Assigned(AEngine));
  
    UnregisterEngine(AEngine.Name);
  end;
  
  procedure TMARSEngineRegistry.UnregisterEngine(const AEngineName: string);
  begin
    FCriticalSection.Enter;
    try
      FItems.Remove(AEngineName);
    finally
      FCriticalSection.Leave;
    end;
  end;
  
  end.
  