UNPKG

preceptor-core

Version:

Core components for the preceptor test runner and aggregator

118 lines (96 loc) 2.45 kB
// Copyright 2014-2015, Yahoo! Inc. // Copyrights licensed under the Mit License. See the accompanying LICENSE file for terms. var _ = require('underscore'); var nodeUtil = require('util'); var EventEmitter = require('events').EventEmitter; var utils = require('./utils'); /** * Base object class * * @constructor * @class Base * @property {string} _uniqueId Unique ID of instance */ function Base () { this._uniqueId = _.uniqueId('instance'); } nodeUtil.inherits(Base, EventEmitter); /** * Used as method for parent-method calls * * @method __super */ Base.prototype.__super = null; /** * Name of instance for debugging purposes * * @property NAME * @type {string} */ Base.prototype.NAME = 'unnamed'; /** * Converts instance to string * * @method toString * @return {string} */ Base.prototype.toString = function () { return "[" + this.constructor.TYPE + "::" + this.NAME + "(" + this._uniqueId + ")" + "]"; }; Base.prototype.constructor = Base; /** * Type of class * * @property TYPE * @static * @type {string} */ Base.TYPE = 'Base'; /** * Extends the class with another class; implementing inheritance * * @method extend * @static * @param {function} [constructorFn] * @param {object} prototypeProperties * @param {object} [staticProperties] * @return {function} */ Base.extend = function (constructorFn, prototypeProperties, staticProperties) { var parent = this, child, F; if (!_.isFunction(constructorFn)) { staticProperties = prototypeProperties; prototypeProperties = constructorFn; constructorFn = undefined; } if (!constructorFn) { constructorFn = function () { return this.__super.apply(this, arguments); }; } child = utils.superWrapper(constructorFn, parent); // Copies the parent methods without wrapping them again utils.extendApply(child, [parent]); // Wrap all new functions with the superWrapper utils.extendApply(child, [staticProperties], utils.superWrapper); F = function () { this.constructor = child; }; F.prototype = parent.prototype; child.prototype = new F(); // Wrap all new prototype methods in the superWrapper utils.extendApply(child.prototype, [prototypeProperties], utils.superWrapper); child.__parent = parent.prototype; return child; }; /** * Static class conversion to string * * @method toString * @static * @return {string} */ Base.toString = function () { return "[" + this.TYPE + "]"; }; module.exports = Base;