From e697f87f8a59bb809ea023d674fc550cb35c61cb Mon Sep 17 00:00:00 2001 From: Tanner Rogalsky Date: Wed, 9 Jan 2013 20:21:36 -0500 Subject: [PATCH 1/2] Allow gotoState to pass arguments to the new state. --- stateful.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/stateful.lua b/stateful.lua index 6dcd4c1..46e5749 100644 --- a/stateful.lua +++ b/stateful.lua @@ -89,8 +89,8 @@ local function _assertExistingState(self, state, stateName) assert(state, "The state " .. stateName .. " was not found in " .. tostring(self.class) ) end -local function _invokeCallback(self, state, callbackName) - if state then state[callbackName](self) end +local function _invokeCallback(self, state, callbackName, ...) + if state then state[callbackName](self, ...) end end local function _getCurrentState(self) @@ -133,9 +133,9 @@ function Stateful.static:addState(stateName, superState) return self.static.states[stateName] end -function Stateful:gotoState(stateName) +function Stateful:gotoState(stateName, ...) - _invokeCallback(self, _getCurrentState(self), 'exitedState') + _invokeCallback(self, _getCurrentState(self), 'exitedState', ...) if stateName == nil then self.__stateStack = { } @@ -144,7 +144,7 @@ function Stateful:gotoState(stateName) local newState = _getStateFromClassByName(self, stateName) self.__stateStack = { newState } - _invokeCallback(self, newState, 'enteredState') + _invokeCallback(self, newState, 'enteredState', ...) end end From 37ffe032fd1ed8afcec166d6de8b93e55aa6ad0d Mon Sep 17 00:00:00 2001 From: Tanner Rogalsky Date: Thu, 21 Feb 2013 18:42:34 -0500 Subject: [PATCH 2/2] Add a unit test to ensure that gotoState properly passes additional arguments to enteredState and exitedState --- spec/unit.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spec/unit.lua b/spec/unit.lua index 75bc887..0d08dfc 100644 --- a/spec/unit.lua +++ b/spec/unit.lua @@ -104,6 +104,17 @@ describe("Unit tests", function() assert_true(e.mark) end) + it("passes all additional arguments to enteredState and exitedState", function() + local FooEnemy = Enemy:addState("FooEnemy") + local testValue = "Bar" + + local validateVarargs = function(self, ...) assert_equal(..., testValue) end + FooEnemy.enteredState = validateVarargs + FooEnemy.exitedState = validateVarargs + + local e = Enemy:new() + e:gotoState("FooEnemy", testValue) + end) end) it("raises an error when given an invalid id", function()