События

Классы

local Game = {}
Game.__index = Game

function Game.new(name)
  return setmetatable({name = name,
                       callbacks = {}}, Game)
end

function Game:start()
  for _, callback in ipairs(self.callbacks) do
    callback(self.name)
  end
end

local Statistic = {}
Statistic.__index = Statistic

function Statistic.new()
  return setmetatable({starts_count = 0,
                       last_game = ""}, Statistic)
end

function Statistic:game_started(game_name)
  self.last_game = game_name
  self.starts_count = self.starts_count + 1
end

local statistic = Statistic.new()
local heroes = Game.new("Heroes")
local doom = Game.new("Doom")

-- The handler is a function, it calls the
-- method of statistic
local function on_start(game_name)
  statistic:game_started(game_name)
end

-- Subscribe to events: add the handler
heroes.callbacks[#heroes.callbacks + 1] = on_start
doom.callbacks[#doom.callbacks + 1] = on_start

doom:start()
heroes:start()
-- statistic.last_game = Heroes
-- statistic.starts_count = 2

print("statistic.last_game = "
      .. statistic.last_game)
print("statistic.starts_count = "
      .. statistic.starts_count)