marko
Version:
UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.
61 lines (47 loc) • 1.62 kB
JavaScript
;
var inherit = require("raptor-util/inherit");
var BaseComponent = require("./Component");
var BaseState = require("./State");
module.exports = function defineComponent(def, renderer) {
if (def.___isComponent) {
return def;
}
var ComponentClass = function () {};
var proto;
var type = typeof def;
if (type == "function") {
proto = def.prototype;
} else if (type == "object") {
proto = def;
} else {
throw TypeError();
}
ComponentClass.prototype = proto;
// We don't use the constructor provided by the user
// since we don't invoke their constructor until
// we have had a chance to do our own initialization.
// Instead, we store their constructor in the "initComponent"
// property and that method gets called later inside
// init-components-browser.js
function Component(id) {
BaseComponent.call(this, id);
}
if (!proto.___isComponent) {
// Inherit from Component if they didn't already
inherit(ComponentClass, BaseComponent);
}
// The same prototype will be used by our constructor after
// we he have set up the prototype chain using the inherit function
proto = Component.prototype = ComponentClass.prototype;
// proto.constructor = def.constructor = Component;
// Set a flag on the constructor function to make it clear this is
// a component so that we can short-circuit this work later
Component.___isComponent = true;
function State(component) {
BaseState.call(this, component);
}
inherit(State, BaseState);
proto.___State = State;
proto.___renderer = renderer;
return Component;
};