/**
 * Base class for all objects on this library.
 */
module.exports = new Class
({
	Extends: Vn.Object

	/**
	 * Gets if the object is ready to be rendered.
	 *
	 * @param {Object} params The query parameters
	 * @return {boolean} %true if the object is ready, %false otherwise
	 */
	,isReady: function ()
	{
		return true;
	}

	/**
	 * Through the query looking for containers and adds it to the batch.
	 *
	 * @return {Array} An array with the names of the found parameters
	 */
	,findHolders: function () {}
	
	/**
	 * Renders the object as an SQL string.
	 *
	 * @param {Object} params The params used to render the object
	 * @return {string} The SQL string
	 */
	,render: function () {}
	
	/**
	 * Renders an objects array.
	 *
	 * @param {Array} list The objects array
	 * @param {Object} params The parameters
	 * @return {string} The rendered SQL string
	 */
	,renderList: function (list, params)
	{
		var sql = '';

		list.forEach (function (item) {
			sql += item.render (params);
		})

		return sql;
	}

	/**
	 * Renders an objects array using a separator.
	 *
	 * @param {Array} list The objects array
	 * @param {Object} params The parameters
	 * @param {String} separator The separator between items
	 * @return {string} The rendered SQL string
	 */
	,renderListWs: function (list, params, separator)
	{
		var sql = '';

		list.forEach (function (item, i) {
			if (i > 0)
				sql += separator;
			sql += item.render (params);
		})

		return sql;
	}

	/**
	 * Renders a quoted SQL identifier.
	 *
	 * @param {String} identifier The identifier
	 * @return {string} The quoted identifier
	 */
	,renderIdent: function (identifier)
	{
		return '`'+ identifier +'`';
	}
	
	/**
	 * Renders a quoted SQL identifier.
	 *
	 * @param {String} identifier The identifier
	 * @return {string} The quoted identifier
	 */
	,renderPreIdent: function (identifier)
	{
		if (identifier)
			return this.renderIdent (identifier) +'.';
		else
			return '';
	}

	/**
	 * Renders the object if it's defined.
	 *
	 * @param {String} prefix The rendered string prefix
	 * @return {string} The rendered object with its prefix
	 */
	,renderIfSet: function (object, prefix, params)
	{
		if (object)
			return ' '+ prefix +' '+ object.render (params);
		else
			return '';
	}
});