Strategy to deal with middleclass statics? #2365
              
                Unanswered
              
          
                  
                    
                      jtackaberry
                    
                  
                
                  asked this question in
                Q&A
              
            Replies: 1 comment 3 replies
-
| Nah. Looks lot of works. I have a better approach. Check out the annotation definition I often use: ---@meta
---kikito middleclass instance definition
---@class instance<string, any>
---
---@field class class
---
---@field initialize fun(self: self, ...)
---@field isInstanceOf fun(self: self, other: class|table): boolean
---kikito middleclass class definition
---@class class: instance
---@overload fun(): instance
---
---@field name string
---@field super class?
---@field static self
---
---@field protected __instanceDict instance
---@field protected __declaredMethods table<string, function>
---@field subclasses { [self]: true }
---@field allocate fun(self: self): instance
---@field new fun(self: self): instance
---@field subclass fun(self: self, newSublassName: string): aNewSubclass: self
---@field subclassed fun(self: self, other: self|table)
---@field isSubclassOf fun(self: self, other: self|table): boolean
---@field include fun(self: self, ...): selfThen overload the context of loaded middleclass package, on required. Usually once. ---@module 'middleclass'
---@overload fun(className: string, super?: table): class
local middleclass = require('src.libraries.middleclass.middleclass')
---Aliasing 'middleclass.middleclass' into 'middleclass', incase it is required by other libraries.
if package.loaded['middleclass'] ~= middleclass then
	package.loaded['middleclass'] = middleclass
endLet's say, I have to define a Superclass for all my project's classes named  local weakKeys, weakValues = { __mode = 'k' }, { __mode = 'v' }
local NOOP = function() end
local _initializedInstances = setmetatable({}, weakKeys) ---@type { [Object]: true? }
---Lua reimplementation of https://love2d.org/wiki/Object
---@class ObjectClass: Object, class
---@overload fun(): Object
---@field new fun(): Object
---@field static self
local ObjectClass = require 'middleclass' ('game.Object')
---Define class's statics and also redefine the class itself.
---@class ObjectClass
local staticObjectClass = ObjectClass.static
staticObjectClass._VERSION = '0.0.1-TRY-0'
---@param logger? function|true
---@return table
function staticObjectClass:debugInfoGetAllInstance(logger)
	logger = logger == true and print
		or type(logger) == 'function' and logger
		or NOOP
	local t = setmetatable({}, weakValues) -- return a weaktable
	for o in pairs(_initializedInstances) do
		table.insert(t, o)
		logger(#t, o)
	end
	return t
end
---@return boolean success # `true` if the object was initialized by this call, `false` if it had been previously initialized (prevent from being re-initialized).
function ObjectClass:initialize()
	if _initializedInstances[self] then return false end
	--> BEGIN
	-- some initialization goes here
	--> END
	_initializedInstances[self] = true
	return true
end
---@class Object: instance
local Object = {}
---@return boolean success # `true` if the object was released by this call, `false` if it had been previously released.
function Object:release()
	if not _initializedInstances[self] then return true end
	_initializedInstances[self] = nil
	return false
end
function Object:type()
  return self.class and self.class.name or type(self)
end
function Object:typeOf(name)
  -- TODO: this checkout class name of current object TIL last super.
end
-- include last
ObjectClass:include(Object)
return ObjectClassFrom code above, take a look at these line: ---@class ObjectClass
local staticObject = ObjectClass.static
---@param logger? function|true
---@return table
function staticObject:debugInfoGetAllInstance(logger)
   -- ...omitted...
endThat is how I define a class static. | 
Beta Was this translation helpful? Give feedback.
                  
                    3 replies
                  
                
            
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment
  
        
    

Uh oh!
There was an error while loading. Please reload this page.
-
#1172 offers an approach to work with middleclass's class initialization:
One of middleclass's features is to set a static values under a static table, after which point those values are accessible from the class:
Unfortunately #1172 didn't address that aspect of the user's question, presumably because handling typing here is problematic.
I can get a bit further by declaring the
staticfield on the class via@field:The only way I can see is to predefine all static values as
@fieldbelow the@class:This suppresses the undefined field warning and the type of
Foo.baris now known, but it's not ideal: when jumping to the definition ofFoo.barit of course lands on the@fieldline rather than theFoo.static.barassignment.Is there a better way to approach this?
Beta Was this translation helpful? Give feedback.
All reactions