// (C) Andrea Giammarchi [www.3site.eu] - MIT Style License
function Strict(returnValue, callback, arguments, name){
return Strict.debug ? Strict.returnValue(returnValue, Strict.apply(callback, arguments, name), name) : callback
};
Strict.apply = function(callback, args, name){
return Strict.debug ? function(){
for(var i = 0; i < arguments.length ; i++){
if(!Strict.check(arguments[i], args[i]))
throw new Error("[".concat(name || callback.name, "] Strict arguments ", i, " Error"));
};
return callback.apply(this, arguments)
} : callback
};
Strict.call = function(){
var name = (arguments = [].slice.call(arguments)).length,
callback = arguments.shift();
return Strict.debug ? Strict.apply(callback, arguments, Strict.check(arguments[name-2], "".constructor) ? arguments.pop() : Strict.Void) : callback
};
Strict.check = function(arguments, constructor){
var returnValue = constructor === Strict.Void;
return arguments === Strict.Void ? returnValue : (arguments === null ? !returnValue : (returnValue ? false : (Strict.object ? (typeof arguments === "object" ? arguments instanceof constructor : arguments.constructor === constructor) : (constructor === Object ? true : (arguments instanceof constructor || arguments.constructor === constructor)))))
};
Strict.returnValue = function(args, callback, name){
return Strict.debug ? function(){
var returnValue = callback.apply(this, arguments);
if(!Strict.check(returnValue, args))
throw new Error("[".concat(name || callback.name, "] Strict returnValue Error"));
return returnValue
} : callback
};
Strict.debug = true; // set false on production enviroment to increase performances removing Strict checks
Strict.object = false; // set true to check primitives too
var Void = Strict.Void = Strict.Void;