orion.Require = function(header) {
	if (header === null)
		throw "header cannot be null";

	this._name = null;
	this._attributes = {};
	this._optional = false;
	this._bundleVersionRange = orion.VersionRange.emptyRange;
	this._wiredBundle = null;

	this._parseRequire(header);
};

orion.Require.prototype = {
	_parseRequire : function(header) {	
		if (typeof header == "string") {
			this._name = header;
			return;
		}
		
		this._name = header.name;
		if (header.bundleVersion)
			this._bundleVersionRange = orion.VersionRange.parseVersionRange(header.bundleVersion);
		
		if (header.resolution)
			this._optional = (header.resolution === "optional");
			
		var attributeName;
		for (attributeName in header) {
			if (header.hasOwnProperty(attributeName))
				this._attributes[attributeName] = header[attributeName];
		}
	},
	getName : function() {
		return this._name;
	},
	getBundleVersionRange : function() {
		return this._bundleVersionRange;
	},
	isOptional : function() {
		return this._optional;
	},
	getAttributes : function() {
		this._attributes;
	},
	wire : function(candidate) {
		if (this._name !== candidate.getName())
			return false;

		if (!this._checkAttributes(candidate))
			return false;

		this._wiredBundle = candidate;
		return true;
	},
	_checkAttributes : function(candidate) {
		for ( var key in this._attributes) {
			if (key === "bundleVersion") {
				if (!this._bundleVersionRange.isIncluded(candidate.getVersion()))
					return false;
			}
		}
		return true;
	},
	getWiredBundle : function() {
		return this._wiredBundle;
	},
	unwire : function() {
		this._wiredBundle = null;
	}
};
