public void testBreakpoints4() {
    String expression = "System.out.println('foo');\n" +
            "a = new Foo244();\n" +
            "update (a) { name = 'bar' };\n" +
            "System.out.println('name:' + a.name);\n" +
            "return a.name;";


    Map<String, Interceptor> interceptors = new HashMap<String, Interceptor>();
    Map<String, Macro> macros = new HashMap<String, Macro>();

    class TestResult {
      boolean firedBefore;
      boolean firedAfter;
    }

    final TestResult result = new TestResult();

    interceptors.put("Update", new Interceptor() {
      public int doBefore(ASTNode node, VariableResolverFactory factory) {
        ((WithNode) node).getNestedStatement().getValue(null,
                factory);
        System.out.println("fired update interceptor -- before");
        result.firedBefore = true;
        return 0;
      }

      public int doAfter(Object val, ASTNode node, VariableResolverFactory factory) {
        System.out.println("fired update interceptor -- after");
        result.firedAfter = true;
        return 0;
      }
    });

    macros.put("update", new Macro() {
      public String doMacro() {
        return "@Update with";
      }
    });

    expression = parseMacros(expression, macros);

    ParserContext ctx = new ParserContext();
    ctx.setDebugSymbols(true);
    ctx.setSourceFile("test2.mv");
    ctx.addImport("Foo244", Foo.class);
    ctx.setInterceptors(interceptors);

    ExpressionCompiler compiler = new ExpressionCompiler(expression, ctx);
    CompiledExpression compiled = compiler.compile();

    System.out.println("\nExpression:------------");
    System.out.println(expression);
    System.out.println("------------");

    MVELRuntime.registerBreakpoint("test2.mv", 3);
    MVELRuntime.registerBreakpoint("test2.mv", 4);
    MVELRuntime.registerBreakpoint("test2.mv", 5);

    final Set<Integer> breaked = new HashSet<Integer>();

    Debugger testDebugger = new Debugger() {
      public int onBreak(Frame frame) {
        System.out.println("Breakpoint [source:" + frame.getSourceName() + "; line:" + frame.getLineNumber() + "]");
        breaked.add(frame.getLineNumber());
        return 0;
      }
    };


    MVELRuntime.setThreadDebugger(testDebugger);

    assertEquals("bar", MVEL.executeDebugger(compiled, null, new MapVariableResolverFactory(createTestMap())));
    assertTrue("did not fire before", result.firedBefore);
    assertTrue("did not fire after", result.firedAfter);
    assertEquals("did not break at expected points", Make.Set.<Integer>$()._(3)._(4)._(5)._(), breaked);
  }