anchor.diff:    final _ctxs = new List<ProgramContext>();
     final _setups = new List<RunOnRenderingContext>();
     final _beforeAlls = new List<RunOnRenderingContext>();
  +  final _beforeEachs = new List<RunOnProgramContext>();
     final _afterAlls =  new List<RunOnRenderingContext>();
     final _teardowns = new List<RunOnRenderingContext>();
     final _onAddProgramCtxs = new List<RunOnProgramContextRegistration>();
     final _onRemoveProgramCtxs = new List<RunOnProgramContextRegistration>();
     final _autoData = new Map<String, RunOnProgramContext>();
  -  FBO fbo;
  +  final _atEachs = new List<RunOnProgramContext>();
   
     ProgramsRunner(this.gl);
   
  
positive.code:     _setups.forEach((f) => f(gl));
      _setups.clear();
  
      if (fbo != null) {
        gl.bindFramebuffer(FRAMEBUFFER, fbo._buf);
      }
  
      _beforeAlls.forEach((f) => f(gl));
  
      _ctxs.forEach((ctx) {
        // useProgram is done outof draw to allow factorisation later
  //      ctx.gl.useProgram(ctx.program);
  //      ctx._befores.forEach((f) => f(ctx));
  //      ctx._ats.forEach((f) => f(ctx));
        ctx._ats.forEach((f){
          ctx.gl.useProgram(ctx.program);
          ctx._befores.forEach((f) => f(ctx));
          f(ctx);
        });
      });
  
      _afterAlls.forEach((f) => f(gl));
      if (fbo != null) {
        gl.bindFramebuffer(FRAMEBUFFER, null);
      }
  
    }
  }
  
  
negative.code:     if (req.setup != null) _setups.add(req.setup);
  
      if (req.beforeAll != null) _beforeAlls.add(req.beforeAll);
      if (req.afterAll != null) _afterAlls.add(req.afterAll);
      if (req.onAddProgramCtx != null) _onAddProgramCtxs.add(req.onAddProgramCtx);
      if (req.onRemoveProgramCtx != null) _onRemoveProgramCtxs.add(req.onRemoveProgramCtx);
      if (req.beforeEach != null) _beforeEachs.add(req.beforeEach);
      if (req.atEach != null) _atEachs.add(req.atEach);
      if (req.autoData != null) req.autoData.forEach((k, v){
        _autoData[k] = v;
      });
  
      if (req.ctx != null) {
  