function Smalltalk(){}; function SmalltalkObject(){}; function SmalltalkBehavior(){}; function SmalltalkClass(){}; function SmalltalkMetaclass(){ this.meta = true; }; function SmalltalkMethod(){}; function SmalltalkNil(){}; var nil = new SmalltalkNil(); var smalltalk = new Smalltalk(); smalltalk.klass = function(spec) { var spec = spec || {}; var that; if(spec.meta) { that = new SmalltalkMetaclass(); } else { that = new (smalltalk.klass({meta: true})).fn; that.klass.instanceClass = that; that.className = spec.className; that.klass.className = that.className + ' class'; } that.fn = spec.fn || function(){}; that.superclass = spec.superclass; that.iVarNames = spec.iVarNames || []; if(that.superclass) { that.klass.superclass = that.superclass.klass; } that.category = spec.category || ""; that.fn.prototype.methods = {}; that.fn.prototype.klass = that; return that; }; smalltalk.method = function(spec) { var that = new SmalltalkMethod(); that.selector = spec.selector; that.category = spec.category; that.source = spec.source; that.fn = spec.fn; return that }; smalltalk.init = function(klass) { var subclasses = smalltalk.subclasses(klass); for(var i=0;i