anchor.diff:  main() {
     var container = query('.container');
   
  -  var number = new NumberFormatter();
  -  var date = new DateFormatter();
  -  var text = new TextFormatter();
  -
  -  number.nextHandler = date;
  -  date.nextHandler = text;
  +  var textFormat = new TextFormatter();
  +  var dateFormat = new DateFormatter(textFormat);
  +  var numberFormat = new NumberFormatter(dateFormat);
   
     var c = new StreamController.broadcast();
     container.onChange.listen(c.add);
     container.onClick.listen(c.add);
   
     var subscription = c.stream.
  -    listen(number.processRequest);
  +    listen(numberFormat);
   
     query('#no-numbers').onChange.listen((e){
       var el = e.target;
       if (el.checked) {
         subscription.cancel();
         subscription = c.stream.
  -        listen(date.processRequest);
  +        listen(dateFormat);
       }
       else {
         subscription.cancel();
         subscription = c.stream.
  -        listen(number.processRequest);
  +        listen(numberFormat);
       }
     });
   
     query('#no-text').onChange.listen((e){
       var el = e.target;
       if (el.checked) {
  -      date.nextHandler = null;
  +      dateFormat.nextHandler = null;
       }
       else {
  -      date.nextHandler = text;
  +      dateFormat.nextHandler = textFormat;
       }
     });
  -
   }
  
positive.code: }
  
  class TextFormatter extends CellFormatter {
    bool _handleRequest(Event e) {
      var input = e.target;
      input.style.textAlign = 'left';
  
negative.code: }
  
  class NumberFormatter extends CellFormatter {
    NumberFormatter([nextHandler]) : super(nextHandler);
  
    bool _handleRequest(Event e) {
      var input = e.target;
      RegExp exp = new RegExp(r"^\s*[\d\.]+\s*$");
  