docs: function(name, resourcesNo, debug, supportConsumersLog){
  		/**
  		@memberof! qpp.Semaphore#
  		@var {string} name - name of the semaphore
  		*/
  		this.name = name || "semaphore";
  		resourcesNo = resourcesNo || 1;
  		/**
  		@memberof! qpp.Semaphore#
  		@private
  		@var {string} initialResources - initial (total) number of resources that Semaphore has
  		*/
  		this.initialResources = resourcesNo;
  		/**
  		@memberof! qpp.Semaphore#
  		@var {string} resourcesNo - currently available number of resources
  		*/
  		this.resourcesNo = resourcesNo;
  		/**
  		@memberof! qpp.Semaphore#
  		@private
  		@var {string} waitingQueue - queue holding the list of waiting consumers (functions) for available resources
  		*/
  		this.waitingQueue = [];
  
  		/**
  		@memberof! qpp.Semaphore#
  		@var {boolean} debug - defines if debugging messages should be shown during Semaphore operations
  		*/
  		this.debug = typeof debug !== 'undefined' ? debug : false;
  		/**
  		@memberof! qpp.Semaphore#
  		@var {boolean} supportConsumersLog - defines if we should support consumers log
  		if set to `true`, every [wait()]{@link qpp.Semaphore#wait} will remmeber the consumer name and
  		return an wait id, that user can provide to [singnal()]{@link qpp.Semaphore#singnal} to signal
  		that the specific wait is finished
  		*/
  		this.supportConsumersLog = typeof supportConsumersLog !== 'undefined' ? supportConsumersLog : false;
  		if(this.supportConsumersLog){
  			/**
  			@memberof! qpp.Semaphore#
  			@var {Array.<number(int)>} consumersLog - consumers log tracking consumers that are currently using resources
  			*/
  			this.consumersLog = [];
  
  			/**
  			@memberof! qpp.Semaphore#
  			@var {Array.<number(int)>} consumerUniqueId - unique id of each new consumption
  			*/
  			this.consumerUniqueId = 0;
  		}
  	}