From b7771499b2e108adccb460c74662768fe428ab60 Mon Sep 17 00:00:00 2001 From: Kampfkarren Date: Sun, 27 Jan 2019 17:56:07 -0800 Subject: [PATCH 1/2] Closes #167 --- lib/Signal.lua | 26 ++++++++++++++++++++++---- lib/Signal_spec.lua | 5 +++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/Signal.lua b/lib/Signal.lua index 87fe40e..3b806a1 100644 --- a/lib/Signal.lua +++ b/lib/Signal.lua @@ -5,6 +5,7 @@ executing an event. ]] +local assign = import("./assign") local typeKey = import("./typeKey") local function immutableAppend(list, ...) @@ -34,6 +35,19 @@ local function immutableRemoveValue(list, removeValue) return new end +local connectionMetatable = {} +connectionMetatable[typeKey] = "RBXScriptConnection" + +function connectionMetatable:__index(key) + local internal = getmetatable(self).internal + + if internal[key] ~= nil then + return internal[key] + end + + error(string.format("%s is not a valid member of RBXScriptConnection", tostring(key)), 2) +end + local Signal = {} Signal.__index = Signal @@ -56,11 +70,15 @@ function Signal:Connect(callback) internal.listeners = immutableAppend(internal.listeners, callback) - local connection = {} - connection.Connected = true + local connection = newproxy(true) + local instance = getmetatable(connection) + instance.internal = { + Connected = true + } + assign(instance, connectionMetatable) - function connection.Disconnect() - connection.Connected = false + function instance.internal.Disconnect() + instance.internal.Connected = false internal.listeners = immutableRemoveValue(internal.listeners, callback) end diff --git a/lib/Signal_spec.lua b/lib/Signal_spec.lua index 38c5f72..9b5b07c 100644 --- a/lib/Signal_spec.lua +++ b/lib/Signal_spec.lua @@ -1,4 +1,5 @@ local Signal = import("./Signal") +local typeof = import("./functions/typeof") describe("Signal", function() it("should be instantiable", function() @@ -94,4 +95,8 @@ describe("Signal", function() signal:Wait() end) end) + + it("should have connections with the typeof RBXScriptConnection", function() + assert.equal("RBXScriptConnection", typeof(Signal.new():Connect(function() end))) + end) end) \ No newline at end of file From c55f05b0cf2c9a9151e7dd9dbdd62fadacb3a9d0 Mon Sep 17 00:00:00 2001 From: Kampfkarren Date: Sun, 27 Jan 2019 20:38:09 -0800 Subject: [PATCH 2/2] Add index error test --- lib/Signal_spec.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/Signal_spec.lua b/lib/Signal_spec.lua index 9b5b07c..8577539 100644 --- a/lib/Signal_spec.lua +++ b/lib/Signal_spec.lua @@ -99,4 +99,10 @@ describe("Signal", function() it("should have connections with the typeof RBXScriptConnection", function() assert.equal("RBXScriptConnection", typeof(Signal.new():Connect(function() end))) end) + + it("should error when giving a bad index", function() + assert.has.errors(function() + local _ = Signal.new():Connect(function() end).Doge + end) + end) end) \ No newline at end of file