 	/// Stores the given event in the buffer, evicting the earliest event if the
 	/// buffer would be over capacity, then forwards it to all waiting
 	/// enumerators.
+	///
+	/// If a terminating event is put into the buffer, it will stop accepting
+	/// any further events (to obey the contract of Enumerable).
 	func put(event: Event<T>) {
 		dispatch_barrier_sync(_queue) {
+			if (self._terminated) {
+				return
+			}
+
 			self._eventBuffer.append(event)
 			if let capacity = self._capacity {
 				while self._eventBuffer.count > capacity {

				}
			}

			for enumerator in self._enumerators {
				enumerator.put(event)
			}

	let _queue = dispatch_queue_create("com.github.ReactiveCocoa.EnumerableBuffer", DISPATCH_QUEUE_SERIAL)
	var _enumerators: Enumerator<T>[] = []
	var _eventBuffer: Event<T>[] = []
	var _terminated = false

	/// Creates a buffer for events up to the given maximum capacity.
	///
