anchor.diff:    }
   }
   
  -class ActorList<T extends Actor> extends ListBase {
  -  
  -  ActorList(Page page) {
  -    page._lists.add(this);
  -  }
  -  
  +class ActorList<T extends Actor> extends SafeList<T> {  
  +  void _update() {
  +    _removeList.addAll(_objs.where((T obj) => obj._destroyed));
  +    super._update();
  +  }
  +  
  +  void setVisible(bool visible) {
  +    for (T actor in _objs) actor.visible = visible;
  +  }
  +  
  +  void destroy() {
  +    for (T actor in _objs) actor.destroy();
  +  }
  +}
  +
  +class SystemList<T extends System> extends SafeList<T> {
  +  
  +}
  +
  +class SafeListItem {
  +  Page page;
  +  num priority = 0.0;
  +}
  +
  +class SafeList<T extends SafeListItem> extends ListBase with SafeListItem {
     List<T> _objs = new List<T>();
     List<T> _addList = new List<T>();
     Set<T> _removeList = new Set<T>();
     
  -  void add(T obj) => _addList.add(obj);
  +  void add(T obj) {
  +    obj.page = page;
  +    _addList.add(obj);
  +  }
     
     bool remove(T obj) {
  -    _removeList.add(obj);
  -    return _objs.contains(obj);
  +    bool contains = _objs.contains(obj);
  +    if (contains) _removeList.add(obj);
  +    return contains;
     }
     
     int get length => _objs.length;
  
positive.code: 
  import "dart:html";
  import "dart:collection";
  import "dart:js";
  import "package:ruler/ruler.dart";
  import "package:tail/tail.dart";
  import "package:pencil/pencil.dart";
  import "package:desk/desk.dart";
  
  class Page {
    CanvasElement canvas;
    Ruler ruler;
    Tail tail;
  
negative.code:   bool contains(Vector p) => p.x >= 0 && p.y >= 0 && p.x < width && p.y < height;
    
    ActorList<Actor> actors;
    SystemList<System> systems;
    SafeList<ActorList> lists;
    
    List<SafeList> _lists;
    
    bool _started = false;
    
    Page({int width:640, int height:480}) {
      ruler = new Ruler();
      pencil = new Pencil.createCanvas(document.body, width, height);
      pencil.getContext().lineWidth = 1.5;
      canvas = pencil.getCanvas();
      tail = new Tail(canvas);
      desk = new Desk();
      ruler.onUpdate(_update);
      _lists = new List<SafeList>();
      actors = new ActorList();
      actors.page = this;
      systems = new SystemList();
      systems.page = this;
      lists = new SafeList<ActorList>();
      lists.page = this;
      _lists.addAll([actors, systems, lists]);
      ruler.start();
    }
  
    int _nextId = 0;
    
    void _update(num dt) {
      if (!_started) {
        _started = true;
        start();
      }
      tail.update();
      for (SafeList list in _lists) list._update();
      for (Actor obj in actors) {
        if (obj._id == null) obj._id = _nextId++;
        obj.update(dt);
      }
      update(dt);
      for (System sys in systems) sys.update(dt);
      for (SafeList list in _lists) list._update();
      
      _draw();
    }
    
    void _draw() {
      if (clearColor != null) pencil.clear(clearColor);
      else pencil.clear();
      for (Actor actor in actors) {
  