@@ -9,22 +9,25 @@ atomic.class = atomic.class or {
99 _metadata = {
1010 id = " atomic" ,
1111 version = atomic .meta .version ,
12- documentation = " https://github.com/TeamMeadows/atomic-framework/wiki" ,
13- icon = " https://github.com/TeamMeadows/atomic-framework/raw/production/assets/logo.png"
1412 }
1513 }
1614}
1715
1816--- @class Atomic.Class
19- --- @field init fun ( self : Atomic.Class , ... : any )?
17+ --- @field private __index table
18+ --- @field private init fun (self : Atomic.Class , ... : any )?
2019--- @field private _classname string ?
2120local classMt = {}
2221classMt .__index = classMt
2322
23+ --- @alias Class Atomic.Class
24+
25+ --- @private
2426function classMt :__tostring ()
25- return " class " .. self :__classname ()
27+ return " Class " .. self :__classname ()
2628end
2729
30+ --- @private
2831--- @return string
2932function classMt :__classname ()
3033 return tostring (self ._classname )
@@ -39,7 +42,7 @@ function atomic.class.create(name, parent)
3942 local class = setmetatable ({ _classname = name }, { __index = parent or classMt })
4043 class .__index = class
4144 class .__tostring = function (self )
42- return " instance of " .. tostring (self ._classname )
45+ return " Instance of " .. tostring (self ._classname )
4346 end
4447
4548 return class
@@ -70,7 +73,8 @@ function atomic.class.get(name, packageOrId, packageVersion)
7073 or type (packageVersion ) == " string" and packageVersion
7174 or pkgName == " atomic" and atomic .meta .version
7275
73- return ((atomic .class ._storage [pkgName ] or {})[pkgVersion ] or {})[name ]
76+ --- @diagnostic disable-next-line
77+ return ((atomic .class ._storage [pkgName ] or {})[istable (pkgVersion ) and pkgVersion :getString () or pkgVersion ] or {})[name ]
7478end
7579
7680--- Creates a new class instance
@@ -123,12 +127,19 @@ function atomic.class.accessors(class, ...)
123127 end
124128end
125129
130+ --- @param version Atomic.SemanticVersion | string
131+ --- @return string
132+ local versionToString = function (version )
133+ --- @diagnostic disable-next-line
134+ return isstring (version ) and version or version :getString ()
135+ end
136+
126137--- Registers the class in the storage, allowing it to be get via ``atomic.class.get``
127138--- @param class Atomic.Class
128139--- @param package Atomic.Package
129140function atomic .class .register (class , package )
130141 local storage = atomic .class ._storage
131- local id , version = package ._metadata .id , package ._metadata .version
142+ local id , version = package ._metadata .id , versionToString ( package ._metadata .version )
132143
133144 if (type (storage [id ]) ~= " table" ) then
134145 storage [id ] = {}
@@ -143,11 +154,43 @@ function atomic.class.register(class, package)
143154 atomic .class ._storage = storage
144155end
145156
157+ --- @param class Atomic.Class
158+ --- @param package Atomic.Package
146159function atomic .class .unregister (class , package )
147160 local storage = atomic .class ._storage
148- local id , version = package .id , package .version
161+ local id , version = package ._metadata . id , versionToString ( package ._metadata . version )
149162
150163 storage [id ][version ][class ._classname ] = nil
151164
152165 atomic .class ._storage = storage
166+ end
167+
168+ --- Returns the parent class of instance
169+ --- @param class Atomic.Class
170+ --- @return Atomic.Class ?
171+ function atomic .class .getParent (class )
172+ local parent = getmetatable (getmetatable (class ))
173+ return parent and parent .__index
174+ end
175+
176+ --- Calls the `init` method in the parent class
177+ ---
178+ --- # Example
179+ --- ```lua
180+ --- local Player = package:getClass("Player")
181+ --- local User = package:class("User", Player) -- creating new class `User` that inherits class `Player`
182+ ---
183+ --- function User:init()
184+ --- super(self) -- calling Player:init() method
185+ --- end
186+ --- ```
187+ --- @param instance Atomic.Class
188+ --- @vararg ...
189+ function atomic .class .super (instance , ...)
190+ local parent = atomic .class .getParent (instance )
191+
192+ assert (parent , " class has no parent" )
193+ assert (isfunction (parent .init ), " parent class has no init method" )
194+
195+ parent .init (instance , ... )
153196end
0 commit comments