docs: function constructors(obj) {
  		// supports: getter and normal function
  		if (arguments.length === 0) obj = this;
  
  		if (obj == null) return [];
  
  		// convert to object from primitives
  		if (typeof obj !== 'object' && typeof obj !== 'function')
  			obj = Object(obj);
  
  		if (obj === Array) return [Array, Function.prototype];
  		if (obj === Error) return [Error, Function.prototype];
  		if (obj === RegExp) return [RegExp, Function.prototype];
  		if (obj === Object) return [Object, Function.prototype];
  		if (obj === String) return [String, Function.prototype];
  		if (obj === Number) return [Number, Function.prototype];
  		if (obj === Boolean) return [Boolean, Function.prototype];
  		if (obj === Function) return [Function, Function.prototype];
  		if (obj.constructor === Array) return [Array, Object];
  		if (obj.constructor === Error) return [Error, Object];
  		if (obj.constructor === RegExp) return [RegExp, Object];
  		if (obj.constructor === Object) return [Object];
  		if (obj.constructor === String) return [String, Object];
  		if (obj.constructor === Number) return [Number, Object];
  		if (obj.constructor === Boolean) return [Boolean, Object];
  
  		var classes = [];
  
  		if (obj instanceof Function) {
  			// for Class/constructor
  			for (; obj; obj = (obj.super_ || obj['super'] || getProto(obj)))
  				if (typeof obj === 'function')
  					classes.push(obj);
  
  			if (classes.length === 0 ||
  					classes[classes.length - 1] !== Function.prototype)
  				classes.push(Function.prototype);
  		}
  		else {
  			var saveObj = obj;
  
  			// for instance/object
  			for (; obj; obj = getProto(obj)) {
  				if (obj.hasOwnProperty) {
  					if (obj.hasOwnProperty('constructor'))
  						classes.push(obj.constructor);
  				}
  				else if (obj.constructor) {
  					if (classes.length === 0 ||
  							classes[classes.length - 1] !== obj.constructor)
  						classes.push(obj.constructor);
  				}
  			}
  
  			if (classes.length === 0 &&
  					saveObj && typeof saveObj.constructor === 'function')
  				classes = [saveObj.constructor];
  
  			if (classes.length === 0 ||
  					classes[classes.length - 1] !== Object)
  				classes.push(Object);
  		}
  
  		return classes;
  	}