Metaclasses are classes that are subclasses of the class of classes. Supported by TclOO and XOTcl. Can be used to do really quite fundamental changes to the way classes work.

LV weird - normally, I would think of a meta class as being something above (and outside) something else, handling information about the something else. Or maybe it is the term subclass that threw me - what does subclass of the class of classes mean?

So, what kinds of really quite fundamental changes can be done with metaclasses in tcloo and xotcl? And are there similar concepts in other tcl based object oriented extensions?

DKF: I don't know. I know that you can't do it with [incr Tcl]; classes aren't (traditionally) objects there. To my mind, the main use for a metaclass is to change the way in which you create a class. Thus, with TclOO you can do this to create something with a much more XOTcl-like feel:

oo::class create Class {
    superclass oo::class
    method constructor {argList body} {
        ::oo::define [self] constructor $argList $body
    method destructor {body} {
        ::oo::define [self] destructor $body
    method filter {args} {
        ::oo::define [self] filter {*}$args
    method forward {name cmdName args} {
        ::oo::define [self] forward $name $cmdName {*}$args
    method method {name argList body} {
        ::oo::define [self] method $name $argList $body
    method mixin {args} {
        ::oo::define [self] mixin {*}$args
    method superclass {args} {
        ::oo::define [self] superclass {*}$args
    method variable {args} {
        ::oo::define [self] variable {*}$args

Another key thing that you can do with a metaclass is change how the create and new methods behave. In particular, you can make them return something other than the fully qualified name of the object. This is especially useful when you are creating a megawidget, where there is a long-standing expectation that widget names are always unqualified (and defined in the global namespace).