 	/// `value`. Note that recursive sets will still deadlock because the
 	/// underlying producer prevents sending recursive events.
 	private let lock: NSRecursiveLock
-	private var _value: Value
+
+	/// The underlying storage of the property. It could outlive the
+  /// property if the producer is being retained.
+	private let state: MutablePropertyState<Value>
 
 	/// The current value of the property.
 	///


	/// A signal that will send the property's changes over time,
	/// then complete when the property has deinitialized.
	public lazy var signal: Signal<Value, NoError> = { [unowned self] in
		var extractedSignal: Signal<Value, NoError>!
		self.producer.startWithSignal { signal, _ in
			extractedSignal = signal
		}
		return extractedSignal
	}()

	/// A producer for Signals that will send the property's current value,
	/// followed by all changes over time, then complete when the property has
	/// deinitialized.
	public let producer: SignalProducer<Value, NoError>

	/// Initializes the property with the given value to start.
	public init(_ initialValue: Value) {
		_value = initialValue

		lock = NSRecursiveLock()
		lock.name = "org.reactivecocoa.ReactiveCocoa.MutableProperty"

		(producer, observer) = SignalProducer.buffer(1)
		observer.sendNext(initialValue)
	}


	var value: Value { get set }
}

/// The state of a `MutableProperty`.
private final class MutablePropertyState<Value> {
	var value: Value

	init(_ value: Value) {
		self.value = value
	}
}

/// A mutable property of type `Value` that allows observation of its changes.
///
/// Instances of this class are thread-safe.
