docs: function addExtras( currentObj, baseObj, fn ) {
  			// Return function name.
  			var clss = currentObj.getClass();
  			for ( var k in currentObj) {
  				if (currentObj.hasOwnProperty(k) && typeof currentObj[k] == 'function' && k != fn) {
  					currentObj[k] = currentObj[k].bind(currentObj);
  					currentObj[k].$name = k;
  					currentObj[k].$Class = clss;
  				}
  			}
  
  			addInstance(currentObj);
  
  			// eachPropertyOf(currentObj.Private, function(val, key){
  			if (currentObj.Private && typeof currentObj.Private[fn] == 'function') {
  				currentObj[fn] = currentObj.Private[fn];
  			}
  			if (currentObj[fn]) {
  				currentObj[fn].$Class = currentObj.getClass();
  				currentObj[fn].$name = fn;
  			}
  			// Check if function have constant.
  			if (currentObj.Const) {
  				var cnt = currentObj.Const;
  				delete cnt.Static;
  				for (k in cnt) {
  					cnt.hasOwnProperty(k) && currentObj.$add(currentObj, k, cnt[k], true);
  				}
  			}
  			// migrate information about abstract method to base class.
  			if (currentObj.isAbstract) {
  				var absMethods = currentObj.prototype.$get("Abstract");
  				currentObj.setAbstractMethods = function( solidObj ) {
  					for ( var k in absMethods) {
  						if (absMethods.hasOwnProperty(k)) {
  							if (typeof solidObj[k] != 'function') {
  								throw "Abstract method " + k + " is not implemented by " + solidObj.getClass();
  							}
  							this[k] = solidObj[k];
  						}
  					}
  					if (baseObj && baseObj.prototype.isAbstract) {
  						baseObj.prototype.setAbstractMethods(solidObj);
  					}
  				};
  			}
  
  			if (baseObj) {
  				if (baseObj.prototype.isAbstract) {
  					baseObj.prototype.getSub = function( ) {
  						return currentObj.isAbstract ? currentObj.getSub() : currentObj;
  					};
  				}
  				currentObj.base = baseObj;
  				baseObj.$ADD(currentObj);
  			}
  		}