/*
 * Axelor Business Solutions
 *
 * Copyright (C) 2005-2017 Axelor (<http://axelor.com>).
 *
 * This program is free software: you can redistribute it and/or  modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
(function() {

"use strict";
	
// integrate underscore.string with underscore
_.mixin(_.str.exports());

var util = this.util ? this.util : this.util = {};

/**
 * Based on the `util.inherits` of `Node.js` with some additional features
 * 
 * 1. The super prototype is attached to the base prototype as `super_`.
 * 2. The base prototype can be provided as third argument.
 * 
 * Example:
 * 
 * 	function Hello(message) {
 * 		this.message = message;
 * 	}
 * 
 * 	Hello.prototype.say = function(what) {
 * 		console.log(what || this.message);	
 * 	}
 * 
 * 	function HelloWorld(message) {
 * 		this.super_.constructor.apply(this, arguments);
 * 	}
 * 
 * 	util.inherits(HelloWorld, Hello, {
 * 		
 * 		say: function(what) {
 * 			// do something
 * 			this.super_.say.apply(this, arguments);
 * 		}
 * 	});
 * 
 * @param ctor the base constructor
 * @param superCtor the super constructor
 * @param proto the prototype of the base constructor (optional)
 * 
 * @returns the base constructor
 */ 
util.inherits = function(ctor, superCtor, /* optional */ proto) {

	var props = {
		constructor: {
			value: ctor,
			enumerable: false,
			writable: true,
			configurable: true
		}
	};

	Object.getOwnPropertyNames(proto||{}).forEach(function(name) {
		props[name] = Object.getOwnPropertyDescriptor(proto, name);
	});

	ctor.super_ = superCtor;
	ctor.prototype = Object.create(superCtor.prototype, props);
	ctor.prototype.super_ = superCtor.prototype;
	
	return ctor;
};

/**
 * Shortcut to `util.inherits`.
 * 
 * @param superCtor the super constructor
 * @param proto the prototype for this contructor
 * 
 * @returns this constructor itself
 */
Function.prototype.inherits = function(superCtor, /* optional */ proto) {
	return util.inherits(this, superCtor, proto);
};

}).call(this);
