Improvements to matrix.eventable
* Support debug-logging to stderr by defining the MATRIX_EVENTABLE_DEBUG_LOG environment variable. * Support for unhooking handlers from events. * Simplify the low-level interface: eventable.functions() now returns the created functions directly, cutting down on an intermediate table. * A new eventable.object() allows adding :hook(), :unhook() and :fire() methods to any table. Firing events always sends the table itself as first event parameter when firing any event.
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
#! /usr/bin/env lua
|
||||
--
|
||||
-- eventable.lua
|
||||
-- Copyright (C) 2016 Adrian Perez <aperez@igalia.com>
|
||||
@@ -9,20 +8,20 @@
|
||||
local eventable = require "matrix.eventable"
|
||||
|
||||
do -- Simple event
|
||||
local ev = assert(eventable())
|
||||
local fire, hook = assert(eventable())
|
||||
local flag = false
|
||||
ev.hook("foo", function () flag = true end)
|
||||
ev.fire("foo")
|
||||
hook("foo", function () flag = true end)
|
||||
fire("foo")
|
||||
assert(flag)
|
||||
end
|
||||
|
||||
do -- Stop at first handler that returns some value
|
||||
local ev = assert(eventable())
|
||||
local fire, hook = assert(eventable())
|
||||
local flag1, flag2, flag3 = false, false, false
|
||||
ev.hook("foo", function () flag1 = true end)
|
||||
ev.hook("foo", function () flag2 = true ; return 42 end)
|
||||
ev.hook("foo", function () flag3 = true ; return 0 end)
|
||||
assert(ev.fire("foo") == 42)
|
||||
hook("foo", function () flag1 = true end)
|
||||
hook("foo", function () flag2 = true ; return 42 end)
|
||||
hook("foo", function () flag3 = true ; return 0 end)
|
||||
assert(fire("foo") == 42)
|
||||
assert(flag1 == true)
|
||||
assert(flag2 == true)
|
||||
assert(flag3 == false)
|
||||
@@ -30,23 +29,45 @@ end
|
||||
|
||||
do -- Arguments to eventable() are passed to handlers
|
||||
local obj = { answer = 42 }
|
||||
local ev = assert(eventable(obj))
|
||||
ev.hook("foo", function (o)
|
||||
local fire, hook = assert(eventable(obj))
|
||||
hook("foo", function (o)
|
||||
assert(o == obj)
|
||||
assert(o.answer == 42)
|
||||
o.answer = 0 -- Mutate
|
||||
end)
|
||||
ev.fire("foo")
|
||||
fire("foo")
|
||||
assert(obj.answer == 0)
|
||||
end
|
||||
|
||||
do -- Multiple arguments passed to eventable
|
||||
local ev = assert(eventable(42, "bar", nil, { v=10 }))
|
||||
ev.hook("foo", function (a, s, n, o)
|
||||
local fire, hook = assert(eventable(42, "bar", nil, { v=10 }))
|
||||
hook("foo", function (a, s, n, o)
|
||||
assert(a == 42)
|
||||
assert(s == "bar")
|
||||
assert(n == nil)
|
||||
assert(o.v == 10)
|
||||
end)
|
||||
ev.fire("foo")
|
||||
fire("foo")
|
||||
end
|
||||
|
||||
do -- Unhooking should work
|
||||
local flag1, flag2 = false, false
|
||||
local h1 = function () flag1 = true end
|
||||
local h2 = function () flag2 = true end
|
||||
|
||||
local fire, hook, unhook = assert(eventable())
|
||||
hook("foo", h1)
|
||||
hook("foo", h2)
|
||||
fire("foo")
|
||||
assert(flag1 == true)
|
||||
assert(flag2 == true)
|
||||
|
||||
flag1, flag2 = false, false
|
||||
unhook("foo", h2)
|
||||
fire("foo")
|
||||
assert(flag1 == true)
|
||||
assert(flag2 == false)
|
||||
|
||||
flag1, flag2 = false, false
|
||||
unhook("foo")
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user