From: James Coglan Date: 2008-06-19T22:23:01+09:00 Subject: Why metaclasses? ------=_Part_4455_20108148.1213881857440 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello all, I've dug around a little bit here but can't quite find the answer I'm looking for. A little background, then I'll get to my question. I write JS.Class, which is a JavaScript library for doing OOP using Ruby idioms. The latest stable release bootstraps JavaScript prototypes to build classes with classical inheritance, mixins etc. It's got many commonly used Ruby features, including late-bound arguments-optional super(), hooks, include() and extend(), etc. You can see it here: http://svn.jcoglan.com/jsclass/tags/1.6.1/source/class.js There are some bugs in this that I'm trying to fix by doing a complete rewrite. Most notably, super() can only call superclasses, not mixins. In 1.6, Module is a tiny syntactic hack around protecting a set of methods using closures. In the new version, Module is right at the core and everything else is implemented using it, so hopefully I'll end up with a more Ruby-like system. Classes use modules to store their instance methods, all objects have modules to manage singleton methods etc. The source is here: http://svn.jcoglan.com/jsclass/branches/modular/source/class.js I've come to this version by poking around in irb and trying to figure out how Ruby works. So in this rewrite, Module is a class, Class is a class that inherits from Module. My understanding is that Classes are essentially Modules that can be instantiated (i.e. they can create new Objects), and that class inheritance is just a special case of module inclusion. In JS.Classs I've got metaclasses, except they're actually modules because that's all I need: something to resolve method lookups etc. that cannot be instantiated. Turns out using Modules for all these things gets you a very long way, and teaches you something about inheritance. So anyway, this question has been really bugging me: in Ruby, how come metaclasses are just that: classes? Given that you cannot instantiate them, is there any reason why they need to be classes instead of just modules? I want this release to be as close to Ruby as possible so if I've seriously misunderstood something I'd rather be put right. -- James Coglan ------=_Part_4455_20108148.1213881857440--