anchor.diff:      return result;
     }
   
  -  @override
  +  void adoptChild(RenderObject child) {
  +    // Make sure to call super first to setup the parent data
  +    super.adoptChild(child);
  +    child.parentData._setupImplicitConstraints(_solver);
  +  }
  +
  +  void dropChild(RenderObject child) {
  +    child.parentData._removeImplicitConstraints(_solver);
  +    super.dropChild(child);
  +  }
  +
     void setupParentData(RenderObject child) {
       if (child.parentData is! AutoLayoutParentData)
         child.parentData = new AutoLayoutParentData(child);
     }
   
  -  @override
  +  bool get sizedByParent => true;
  +
  +  void performResize() {
  +    size = constraints.biggest;
  +  }
  +
     void performLayout() {
       // Step 1: Update dimensions of self
  -    size = constraints.biggest;
       _applyEditsAtSize(_solver, size);
   
       // Step 2: Resolve solver updates and flush parameters
  
positive.code:     _implicitConstraints = implicit;
    }
  
    void _collectImplicitConstraints(al.Solver solver) {
      if (_implicitConstraints == null || _implicitConstraints.length == 0) {
        return;
      }
  
negative.code: 
    final RenderBox _renderBox;
  
    void _applyAutolayoutParameterUpdates() {
      // This is called by the parent's layout function
      // to lay our box out.
      assert(_renderBox.parentData == this);
      assert(_renderBox.parent.debugDoingThisLayout);
      BoxConstraints size = new BoxConstraints.tightFor(
        width: _rightEdge.value - _leftEdge.value,
        height: _bottomEdge.value - _topEdge.value
      );
      _renderBox.layout(size);
      position = new Point(_leftEdge.value, _topEdge.value);
    }
  
    List<al.Constraint> _constructImplicitConstraints() {
      return [
        _leftEdge >= al.cm(0.0), // The left edge must be positive.
        _rightEdge >= _leftEdge, // Width must be positive.
      ];
    }
  
  }
  
  class RenderAutoLayout extends RenderBox
  