function Rug( options ) {
	var self;
	var keys;
	var opts;
	var key;
	var i;
	if ( !instanceOf( this, Rug ) ) {
		if ( arguments.length ) {
			return new Rug( options );
		}
		return new Rug();
	}
	self = this;

	opts = copy( defaults );
	opts.isDefined = isDefined;
	opts.scale = linear();

	if ( arguments.length ) {
		if ( !isObject( options ) ) {
			throw new TypeError( format( 'invalid argument. Options argument must be an object. Value: `%s`.', options ) );
		}
		opts = merge( opts, options );
	}
	debug( 'Creating an instance with the following configuration: %s.', JSON.stringify( opts ) );
	EventEmitter.call( this );

	for ( i = 0; i < PRIVATE_PROPS.length; i++ ) {
		defineProperty( this, PRIVATE_PROPS[i], {
			'configurable': false,
			'enumerable': false,
			'writable': true,
			'value': null
		});
	}
	// Set options...
	keys = objectKeys( opts );
	for ( i = 0; i < keys.length; i++ ) {
		key = keys[ i ];
		this[ key ] = opts[ key ];
	}

	this.on( 'change', onChange );
	this.on( '_render', onRender );

	return this;

	/**
	* Callback invoked upon receiving a change event.
	*
	* @private
	*/
	function onChange() {
		debug( 'Received a change event.' );
		if ( self._autoRender ) { // eslint-disable-line no-underscore-dangle
			self.render();
		}
	}

	/**
	* Re-emits a render event.
	*
	* @private
	*/
	function onRender() {
		var args;
		var i;
		debug( 'Received a render event. Re-emitting...' );
		args = new Array( arguments.length+1 );
		args[ 0 ] = 'render';
		for ( i = 0; i < arguments.length; i++ ) {
			args[ i+1 ] = arguments[ i ];
		}
		self.emit.apply( self, args );
	}
}
Rug constructor.

@constructor
@param {Options} [options] - constructor options
@param {boolean} [options.autoRender=false] - indicates whether to re-render on a change event
@param {(string|Function)} [options.color="#aaa"] - color
@param {ArrayLike} [options.data=[]] - data
@param {Function} [options.isDefined] - predicate function indicating whether a datum is defined
@param {(string|Function)} [options.label] - label
@param {(number|Function)} [options.opacity=0.9] - opacity
@param {string} [options.orientation="bottom"] - orientation
@param {Function} [options.scale] - scale function
@param {NonNegativeInteger} [options.size=6] - tick (tassel) size
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@returns {Rug} Rug instance

@example
var node = new Rug({
    'data': [ 0.1, 0.2, 0.3 ]
});
// returns <Rug>