         }
 
         // Store getter
+        var previousValue: Any?
         var cachedValue: Any?
         _valueClearers.append {
+            previousValue = cachedValue
             cachedValue = nil
+        }
+        _valueHasChanged[symbol] = { [unowned self] in
+            guard let previousValue = previousValue, let cachedValue = cachedValue else {
+                return true
+            }
+            return !self.areEqual(previousValue, cachedValue)
         }
         let evaluate = expression.evaluate
         let symbols = expression.symbols

        }
        for (name, expression) in _viewExpressions {
            let value = try expression.evaluate()
            if animated {
                try _view?.setAnimatedValue(value, forExpression: name)
            } else {

    private var _viewControllerExpressions = [String: LayoutExpression]()
    private var _viewExpressions = [String: LayoutExpression]()
    private var _valueClearers = [() -> Void]()
    private var _valueHasChanged = [String: () -> Bool]()

    private lazy var viewControllerConstructorArgumentTypes: [String: RuntimeType]? = self.viewControllerClass?.parameterTypes
    private lazy var viewConstructorArgumentTypes: [String: RuntimeType] = self.viewClass.parameterTypes
