Unfortunately, since the meta-objects are user-defined they are provided without any pre-defined information or behavior. For the same reasons, the Nit OO mechanisms do not rely on this user-defined meta-level.
However meta
permits the definition of user-defined meta-classes at any level
of meta, even with user-defined meta-loops.
Meta-classes can be defined easily in 3 steps:
XObject
)XClass[E: XObject] super Class[E]
)CLASS
and class_factory
in the rootclass XObject
redef CLASS: XClass[SELF]
redef class_factory(name) do return new XClass[SELF](name)
end
class XClass[E: XObject] super Class[E] end
var x1 = new XObject
var x2 = new XObject
assert x1.get_class == x2.get_class
assert x1.get_class isa XClass[XObject]
assert x1.get_class.get_class isa Class[XClass[XObject]]
Currently works only with the interpreter nit
and the compiler with --erasure
(without --rta
).
--rta
will try to detect all the runtime types, and will infinitely discover Class[Class[Class[....]]]
.
Unfortunately, --separate
and --global
require --rta
.
Moreover, the interpreter and --erasure
have a different behavior with generics since
with --erasure
a single meta-instance is shared for all type variations of a same generic class.
Class names are used as a primary key to identify classes. But name conflicts are not managed and will make the program crashes at runtime (on some cast error)