function Graph( options ) {
	var self;
	var opts;
	var err;
	if ( !( this instanceof Graph ) ) {
		return new Graph( options );
	}
	self = this;
	opts = copy( defaults );
	err = validate( opts, options );
	if ( err ) {
		throw err;
	}
	debug( 'Creating an instance with the following configuration: %s.', JSON.stringify( opts ) );
	EventEmitter.call( this );

	defineProperty( this, '_translateX', {
		'configurable': false,
		'enumerable': false,
		'writable': true,
		'value': opts.translateX
	});
	defineProperty( this, '_translateY', {
		'configurable': false,
		'enumerable': false,
		'writable': true,
		'value': opts.translateY
	});
	defineProperty( this, '_autoRender', {
		'configurable': false,
		'enumerable': false,
		'writable': true,
		'value': opts.autoRender
	});

	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 );
	}
}
Graph constructor.

@constructor
@param {Options} options - constructor options
@param {NonNegativeInteger} [options.translateX=0] - horizontal translation
@param {NonNegativeInteger} [options.translateY=0] - vertical translation
@param {boolean} [options.autoRender=false] - indicates whether to re-render on a change event
@throws {TypeError} must provide valid options
@returns {Graph} graph instance

@example
var graph = new Graph({
    'translateX': 90,
    'translateY': 20
});