Skip to content

Instantly share code, notes, and snippets.

@Codinablack
Forked from Zbizu/ClassWithAutoMethods.lua
Created January 19, 2022 19:00
Show Gist options
  • Save Codinablack/dad3b59195367ff67f4523793aa64b20 to your computer and use it in GitHub Desktop.
Save Codinablack/dad3b59195367ff67f4523793aa64b20 to your computer and use it in GitHub Desktop.
automated getter/setter generation example for lua "classes"
local defaults = {
name = "",
words = "",
mana = 0,
manaPercent = 0,
soul = 0,
spellId = 0,
range = -1,
level = 0,
magLevel = 0,
cooldown = 1000,
groupCooldown = 1000,
secondaryGroupCooldown = 0,
group = SPELLGROUP_NONE,
secondaryGroup = SPELLGROUP_NONE,
spellType = SPELL_UNDEFINED,
premium = false,
enabled = true,
learnable = false,
pzLock = false,
aggressive = true,
blockingCreature = false,
blockingSolid = false,
needWeapon = true,
selfTarget = false,
needTarget = false,
vocations = {}
}
-- necessary for automated getter/setter
-- do not move, else it will also generate for methods starting with "__"
local keys = {}
for key, _ in pairs (defaults) do
table.insert(keys, key)
end
LuaSpell = setmetatable(defaults,
{
__call = function(luaSpell, ...)
return luaSpell.new(...)
end
}
)
LuaSpell.__index = LuaSpell
LuaSpell.__call = function(self)
return LuaSpell.new(self)
end
function LuaSpell.new(name, words)
local self = setmetatable({ }, LuaSpell)
if name then
self.name = name
end
if words then
self.words = words
end
return self
end
-- getter/setter generator
local function generate(key)
local k = key
k = k:gsub("^%l", string.upper)
local getter = "function LuaSpell:get" .. k .. "() return self." .. key .. " end"
print(getter)
loadstring(getter)()
local setter = "function LuaSpell:set" .. k .. "(value) self." .. key .. " = value end"
print(setter)
loadstring(setter)()
end
-- auto generate getter/setter
for i = 1, #keys do
generate(keys[i])
end
obj_1 = LuaSpell("obj 1")
obj_2 = LuaSpell("obj 2")
obj_3 = LuaSpell()
obj_1:setName("obj 1 modified")
print(obj_1:getName(), obj_2:getName(), obj_3:getName())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment