         return view.isHidden
     }
 
-    private func computeFrame() throws -> CGRect {
-        return CGRect(
-            x: try CGFloat(doubleValue(forSymbol: "left")),
-            y: try CGFloat(doubleValue(forSymbol: "top")),
-            width: try CGFloat(doubleValue(forSymbol: "width")),
-            height: try CGFloat(doubleValue(forSymbol: "height"))
-        )
-    }
-
-    var _frame: CGRect?
-
     // TODO: should this be public?
     public var frame: CGRect {
-        guard let frame = _frame else {
-            _frame = attempt { try computeFrame() }
-            return _frame ?? .zero
-        }
-        return frame
+        return attempt {
+            CGRect(
+                x: try CGFloat(doubleValue(forSymbol: "left")),
+                y: try CGFloat(doubleValue(forSymbol: "top")),
+                width: try CGFloat(doubleValue(forSymbol: "width")),
+                height: try CGFloat(doubleValue(forSymbol: "height"))
+            )
+        } ?? .zero
     }
 
     private func inferContentSize() throws -> CGSize {

        _evaluating.removeAll()
        _getters.removeAll()
        _cachedExpressions.removeAll()
        for child in children {
            child.cleanUp()
        }

        }
    }

    private func clearCachedValues() {
        for fn in _valueClearers { fn() }
    }

    private func cleanUp() {
        assert(_setupComplete)
        if let error = _unhandledError, error.isTransient {
