 	public override func canDiff(other: Element) -> Bool {
 		if !super.canDiff(other) { return false }
 
-		if rootRealizedElement == nil {
-			update()
-		}
-
 		// Use `unsafeBitCast` instead of `as` to avoid a runtime crash.
 		let otherComponent = unsafeBitCast(other, Component.self)
-		if rootRealizedElement == nil || otherComponent.rootRealizedElement == nil { return false }
-
-		return rootRealizedElement!.element.canDiff(otherComponent.rootRealizedElement!.element)
+		if rootElement == nil {
+			update()
+		}
+
+		return rootElement!.canDiff(otherComponent.rootRealizedElement!.element)
 	}
 	
 	public override func applyDiff(view: ViewType, other: Element) {

		let otherComponent = unsafeBitCast(other, Component.self)
		hostView = otherComponent.hostView

		if rootRealizedElement == nil || otherComponent.rootRealizedElement == nil { return }

		rootRealizedElement!.element.applyDiff(view, other: otherComponent.rootRealizedElement!.element)

		super.applyDiff(view, other: other)
	}
	
	public override func realize() -> ViewType? {
		realizeInHostView()

		return rootRealizedElement?.view
	}


		precondition(hostView == nil, "\(self) has already been added to a view. Remove it before adding it to a new view.")

		hostView = view
		let realizedElement = realizeComponent()
		if let realizedView = realizedElement.view {
			view.addSubview(realizedView)
		}

		rootRealizedElement = realizedElement
	}

	private func realizeComponent() -> RealizedElement {
		componentWillRealize()

		update()

		let realizedRoot = realizeNewRoot(rootElement!)

		componentDidRealize()

		return realizedRoot
	}

	/// Remove the component from its host view.
