function JSExport(header, exportingBundle) {
	if (header === null)
		throw "header cannot be null";

	if (exportingBundle === null)
		throw "exportingBundle cannot be null";

	this._name = null;
	this._version = Version.EMPTY_VERSION;
	this._attributes = {};
	this._directives = {};
	this._mandatory = [];
	this._exportingBundle = exportingBundle;

	_parseExport(header);
}

JSExport.prototype = {
	_parseExport : function(header) {
		var tokens = header.split(Constants.PARAMETER_DELIMITER);
		this._name = tokens[0].replace(/^\s+|\s+$/g, '');
		for ( var i = 1; i < tokens.length; i++) {
			var token = tokens[i];
			if (token.indexOf(Constants.DIRECTIVE_EQUALS) !== -1)
				this._parseDirective(token);
			else if (token.indexOf(Constants.ATTRIBUTE_EQUALS) !== -1)
				this._parseAttribute(token);
			else
				throw "bad export syntax: " + token + " in " + header;
		}
	},
	_parseAttribute : function(token) {
		var index = token.indexOf(Constants.ATTRIBUTE_EQUALS);
		var attributeName = token.substring(0, index).replace(/^\s+|\s+$/g, '');
		if (attributeName.length === 0)
			return;

		var value = token.substring(index + Constants.ATTRIBUTE_EQUALS.length).replace(/^\s+|\s+$/g, '');

		if (attributeName === Constants.VERSION_ATTRIBUTE)
			this._version = Version.parseVersion(value);

		this._attributes[attributeName] = value;
	},
	_parseDirective : function(token) {
		var index = token.indexOf(Constants.DIRECTIVE_EQUALS);
		var directiveName = token.substring(0, index).replace(/^\s+|\s+$/g, '');
		if (directiveName.length === 0)
			return;

		var value = token.substring(index + Constants.DIRECTIVE_EQUALS.length).replace(/^\s+|\s+$/g, '');
		if (directiveName === Constants.MANDATORY_DIRECTIVE)
			this._parseMandatory(value);

		this._directives[directiveName] = value;
	},
	_parseMandatory : function(value) {
		var tokens = value.split(Constants.MANDATORY_DELIMITER);
		for ( var i = 0; i < tokens.length; i++) {
			var token = tokens[i].replace(/^\s+|\s+$/g, '');
			if (token.length > 0)
				this._mandatory.push(token);
		}
	},
	getName : function() {
		return this._name;
	},
	getVersion : function() {
		return this._version;
	},
	getBundleId : function() {
		return this._exportingBundle.getBundleId();
	},
	getBundleSymbolicName : function() {
		return this._exportingBundle.getSymbolicName();
	},
	getBundleVersion : function() {
		return this._exportingBundle.getVersion();
	},
	getAttributes : function() {
		this._attributes;
	},
	getDirectives : function() {
		return this._directives;
	},
	getExportingbundle : function() {
		return this._exportingBundle;
	},
	getMandatory : function() {
		return this._mandatory;
	},
	_addToScope : function (scope) {
		var value = this._exportingBundle.lookup(this._name);
		var tokens = this._name.split(".");
		var i = 0;
		while (true) {
			var token = tokens[i++];
			var current = null;
			if (scope.hasOwnProperty(token)) {
				current = scope[token];
			}
			if (i === tokens.length) {
				if (current === null || current === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
					if (typeof value === "object") {
						var wrappedValue = {};
						wrappedValue.prototype = value;
						value = wrappedValue;
					}
					scope[token]= value;
					return;
				}
				throw "Resolve error: " + this._name + " already exists for " + this.toString();				
			}
			if (current === null || current === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
				current = scope[token];
				if (current === null || current === this.undefined_jsdtbug) { //FIXME jsdt undefined bug
					current = {};
				} else if (typeof current === "object") {
					var wrappedCurrent = {};
					wrappedCurrent.prototype = current;
					current = wrappedCurrent;
				} else
					throw "Resolve error: " + this._name + "-" + token + " already exists for " + this.toString(); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
				scope[token] = current;
			}
			scope = current;
		}
	}
};
