Good practice in terms of memory yes, but organization I don’t know, good practice if it seems comfortable and functional to you, it is also good practice in visual terms.
Personally, I like OOP better
-- Module --
local Methods = {}
-- Constructor --
local Storage = {}
return function(Rig: Model)
if Storage[Rig] then return Storage[Rig] end
-- new --
local self = table.clone(Methods)
self.Limits = {
--something
}
self.Levels = {
--something
}
-- Storage --
Storage[Rig] = self
return self
end
summary: a table that stores information, you can add methods that apply to that object and store more complex values (table with values, instances)