type
  //events are built into the language:
  //a method pointer type
  TGameStartedEvent = procedure(
    const AName: stringof object;

  TGame = class
  private
    FName: string;
  public
    OnStarted: TGameStartedEvent;
    constructor Create(const AName: string);
    procedure Start;
  end;

  TStatistic = class
  public
    StartsCount: Integer;
    LastGame: string;
    procedure GameStarted(const AName: string);
  end;

constructor TGame.Create(const AName: string);
begin
  FName := AName;
end;

procedure TGame.Start;
begin
  if Assigned(OnStarted) then
    OnStarted(FName);
end;

procedure TStatistic.GameStarted(
  const AName: string);
begin
  Inc(StartsCount);
  LastGame := AName;
end;

var
  Statistic: TStatistic;
  Heroes, Doom: TGame;
begin
  Statistic := TStatistic.Create;
  Heroes := TGame.Create('Heroes');
  Doom := TGame.Create('Doom');

  //subscribe to events
  Heroes.OnStarted := Statistic.GameStarted;
  Doom.OnStarted := Statistic.GameStarted;

  Doom.Start;
  Heroes.Start;
  //statistic.LastGame is 'Heroes'
  //statistic.StartsCount is 2

  WriteLn('lastGame is ', Statistic.LastGame);
  WriteLn('startsCount is ',
    Statistic.StartsCount);
end.