 /// Represents the lifetime of an object, and provides a hook to observe when
 /// the object deinitializes.
 public final class Lifetime {
-	// MARK: Type properties and methods
-
-	/// Factory method for creating a `Lifetime` and its associated `Token`.
-	///
-	/// - returns: A `(lifetime, token)` tuple.
-	public static func make() -> (lifetime: Lifetime, token: Token) {
-		let token = Token()
-		return (Lifetime(token), token)
-	}
-
-	/// A `Lifetime` that has already ended.
-	public static var empty: Lifetime {
-		return Lifetime(ended: .empty)
-	}
-
-	// MARK: Instance properties
+	private let disposables: CompositeDisposable
 
 	/// A signal that sends a `completed` event when the lifetime ends.
 	///
 	/// - note: Consider using `Lifetime.observeEnded` if only a closure observer
 	///         is to be attached.
- 	public let ended: Signal<Never, NoError>
+	public var ended: Signal<Never, NoError> {
+		return Signal { observer in
+			return disposables += observer.sendCompleted
+		}
+	}
 
-	// MARK: Initializers
+	/// A flag indicating whether the lifetime has ended.
+	public var hasEnded: Bool {
+		return disposables.isDisposed
+	}
 
-	/// Initialize a `Lifetime` object with the supplied ended signal.
+	/// Initialize a `Lifetime` object with the supplied composite disposable.
 	///
 	/// - parameters:
-	///   - signal: The ended signal.
-	private init(ended signal: Signal<Never, NoError>) {
-		ended = signal
+	///   - signal: The composite disposable.
+	internal init(_ disposables: CompositeDisposable) {
+		self.disposables = disposables
 	}
 
 	/// Initialize a `Lifetime` from a lifetime token, which is expected to be

	///   - token: A lifetime token for detecting the deinitialization of the
	///            associated object.
	public convenience init(_ token: Token) {
		self.init(ended: token.ended)
	}

	/// Observe the termination of `self`.

	/// ```
	public final class Token {
		/// A signal that sends a Completed event when the lifetime ends.
		fileprivate let disposables: CompositeDisposable

		public init() {
			disposables = CompositeDisposable()
		}

		deinit {
			disposables.dispose()
		}
	}
}
