 	}
 }
 
+/// An abstract type representing a way to specify versions.
+public protocol VersionType: Scannable, Equatable {}
+
 /// Represents a single dependency of a project.
-public struct Dependency: Equatable {
+public struct Dependency<V: VersionType>: Equatable {
 	/// The GitHub repository in which this dependency lives.
 	public var repository: Repository
 
 	/// The version(s) that are required to satisfy this dependency.
-	public var version: VersionSpecifier
-}
-
-public func ==(lhs: Dependency, rhs: Dependency) -> Bool {
+	public var version: V
+}
+
+public func ==<V>(lhs: Dependency<V>, rhs: Dependency<V>) -> Bool {
 	return lhs.repository == rhs.repository && lhs.version == rhs.version
 }
 

		}
	}
}

private func intersection(#atLeast: Version, #compatibleWith: Version) -> VersionSpecifier? {
	if atLeast.major > compatibleWith.major {

				return
			}

			switch (Dependency<VersionSpecifier>.fromScanner(scanner)) {
			case let .Success(dep):
				cartfile.dependencies.append(dep.unbox)

