anchor.diff:      _performance.play();
     }
   
  -  void syncFields(Drawer source) {
  -    children = source.children;
  -    level = source.level;
  -    navigator = source.navigator;
  -    if (showing != source.showing) {
  -      showing = source.showing;
  -      if (showing) {
  -        _show();
  -      } else {
  -        _performance.reverse();
  -      }
  -    }
  -    onStatusChanged = source.onStatusChanged;
  -    super.syncFields(source);
  +  void _hide() {
  +    _performance.reverse();
     }
   
  -  // TODO(mpcomplete): the animation system should handle building, maybe? Or
  -  // at least setting the transform. Figure out how this could work for things
  -  // like fades, slides, rotates, pinch, etc.
     Widget build() {
  -    // TODO(mpcomplete): animate as a fade-in.
  -    double scaler = _performance.progress;
  -    Color maskColor = new Color.fromARGB((0x7F * scaler).floor(), 0, 0, 0);
  -
       var mask = new Listener(
  -      child: new Container(decoration: new BoxDecoration(backgroundColor: maskColor)),
  +      child: new Container(
  +        decoration: new BoxDecoration(backgroundColor: _maskColor.value)
  +      ),
         onGestureTap: handleMaskTap
       );
   
  -    Widget content = _builder.build(
  -      new Container(
  +    Matrix4 transform = new Matrix4.identity();
  +    transform.translate(_position.value.x, _position.value.y);
  +    Widget content = new Transform(
  +      transform: transform,
  +      child: new Container(
           decoration: new BoxDecoration(
             backgroundColor: Theme.of(this).canvasColor,
             boxShadow: shadows[level]),
  
positive.code:   DrawerStatusChangedCallback onStatusChanged;
    Navigator navigator;
  
    AnimationPerformance _performance;
    AnimationBuilder _builder;
  
    void initState() {
      _builder = new AnimationBuilder()
        ..position = new AnimatedType<Point>(
            new Point(-_kWidth, 0.0), end: Point.origin, curve: _kAnimationCurve);
      _performance = _builder.createPerformance([_builder.position],
                                                  duration: _kBaseSettleDuration)
          ..addListener(_checkForStateChanged);
      watch(_performance);
      if (showing)
        _show();
    }
  
    void _show() {
  
negative.code: // TODO(mpcomplete): The curve must be linear if we want the drawer to track
  // the user's finger. Odeon remedies this by attaching spring forces to the
  // initial timeline when animating (so it doesn't look linear).
  const Point _kOpenPosition = Point.origin;
  const Point _kClosedPosition = const Point(-_kWidth, 0.0);
  const Curve _kAnimationCurve = linear;
  
  typedef void DrawerStatusChangeHandler (bool showing);
  