diff --git a/node_modules/reactive/lib/model.coffee b/node_modules/reactive/lib/model.coffee index ec56c5df1..8fae7dec3 100644 --- a/node_modules/reactive/lib/model.coffee +++ b/node_modules/reactive/lib/model.coffee @@ -28,10 +28,12 @@ class RModel extends EventEmitter if schema.attributes.hasOwnProperty(k) @set(k, v) - @initialize(options) + for mixin in schema.mixinClasses + mixin.prototype.initialize?.call(this, options) toString: -> @_id + # TODO: remove this method after removing all calls to super.initialize in all initialize methods of all models initialize: (options) -> dispose: -> diff --git a/node_modules/reactive/lib/schema.coffee b/node_modules/reactive/lib/schema.coffee index 2f9905294..508675606 100644 --- a/node_modules/reactive/lib/schema.coffee +++ b/node_modules/reactive/lib/schema.coffee @@ -1,6 +1,7 @@ debug = require('debug')('reactive') types = require('./types') _ = require 'underscore' +RModel = require './model' class RAttributeSchema @@ -59,13 +60,12 @@ class RRegularPropertySchema class RModelSchema constructor: (@universe, originalModelClass) -> - @modelClass = @_createSingletonClass(originalModelClass) + @modelClass = @_createSingletonClass(RModel, originalModelClass.name) + @mixinClasses = [] @attributes = {} @autoBlocks = [] - @_handleMagicKeys(@modelClass) - toString: -> "#{@modelClass.name}.schemaObj" @@ -84,15 +84,15 @@ class RModelSchema return result - _createSingletonClass: (modelClass) -> + _createSingletonClass: (modelClass, newClassName) -> ## This would be a sane way to do this, if Function.name wasn't unassignable # singletonClass = (args...) -> # modelClass.apply(this, args) - # singletonClass.name = modelClass.name + # singletonClass.name = newClassName # so let's do it the insane way global.REACTIVE_CLASS_CREATION_HACK = modelClass - singletonClass = eval("(function(modelClass) { return function #{modelClass.name}() { modelClass.apply(this, arguments); }; })(global.REACTIVE_CLASS_CREATION_HACK);") + singletonClass = eval("(function(modelClass) { return function #{newClassName}() { modelClass.apply(this, arguments); }; })(global.REACTIVE_CLASS_CREATION_HACK);") delete global.REACTIVE_CLASS_CREATION_HACK; singletonClass.isSingletonClass = yes @@ -109,11 +109,20 @@ class RModelSchema _extendModel: (mixinClass) -> + @mixinClasses.push mixinClass + for own k, v of mixinClass + # workaround for how __extends behaves in CoffeeScript; can be removed when model classes stop deriving from R.Model + continue if RModel.hasOwnProperty(k) + if @modelClass.hasOwnProperty(k) throw new Error "Key #{JSON.stringify(k)} is already defined on model #{@modelClass.name}, cannot redefine in mixin #{mixinClass.name}" @modelClass[k] = v - for k, v of mixinClass.prototype when !(k is 'schema') + + for k, v of mixinClass.prototype when !(k in ['schema', 'constructor', 'initialize']) + # workaround for how __extends behaves in CoffeeScript; can be removed when model classes stop deriving from R.Model + continue if RModel.prototype.hasOwnProperty(k) + if @modelClass.prototype.hasOwnProperty(k) throw new Error "Prototype key #{JSON.stringify(k)} is already defined on model #{@modelClass.name}, cannot redefine in mixin #{mixinClass.name}" @modelClass.prototype[k] = v diff --git a/node_modules/reactive/lib/universe.coffee b/node_modules/reactive/lib/universe.coffee index 65c76c1d8..d57a2a052 100644 --- a/node_modules/reactive/lib/universe.coffee +++ b/node_modules/reactive/lib/universe.coffee @@ -56,7 +56,10 @@ class RUniverse extends EventEmitter modelSchema: (modelClass) -> unless modelClass.name throw new Error "R.Universe require model classes to have a .name" - @_modelSchemas[modelClass.name] or= new RModelSchema(this, modelClass) + unless @_modelSchemas.hasOwnProperty(modelClass.name) + schema = @_modelSchemas[modelClass.name] = new RModelSchema(this, modelClass) + schema.mixin modelClass + @_modelSchemas[modelClass.name] _internal_modelChanged: (model) -> # debug "Model change pending: #{model}"