anchor.diff:      var textField = el.query(".task-text");
   
       var task = new Task.fromText(textField.value);
  -    model.add(task);
  -    task.save();
  +    tasks.add(task);
  +    repo.save(task);
   
       textField.value = "";
     }
   }
   
   class TasksPresenter extends smvp.Presenter<Tasks>{
  -  TasksPresenter(tasks, el) : super(tasks, el, taskListTemplate){
  -    model.fetch();
  +  TasksRepository repo;
  +
  +  TasksPresenter(this.repo, tasks, el) : super(tasks, el, taskListTemplate){
  +    repo.find().then((list) => model.reset(list));
     }
   
     subscribeToModelEvents(){
  
positive.code: import 'dart:html';
  import 'package:simple_mvp/simple_mvp.dart' as smvp;
  
  class Tasks extends smvp.ModelList<Task>{
    final rootUrl = "/api/tasks";
  
    makeInstance(attrs, list) => new Task(attrs, list);
  }
  
  class Task extends smvp.Model {
    Task(attrs, modelList): super(attrs, modelList);
    Task.fromText(String text): this({"text": text, "status": "inProgress"}, null);
    
    final rootUrl = "/api/task";
    final createUrl = "/api/tasks";
  
    get isCompleted => status == "completed";
  
    complete(){
      status = "completed";
      save();
    }
  
    inProgress(){
      status = "inProgress";
      save();
    }
  }
  
  
negative.code: 
  
  class TaskPresenter extends smvp.Presenter<Task> {
    Tasks tasks;
    TasksRepository repo;
  
    TaskPresenter(this.repo, this.tasks, task, el) : super(task, el, oneTaskTemplate);
  
    subscribeToModelEvents() {
      model.on.change.add(_onChange);
  