import org.aspectj.testing.Tester;

public class CFlowObjects {
    public static void main(String[] args){
	new Test().go();
	Tester.checkEqual(Test.cflowObjects, 1, "1st cflow");
	Tester.checkEqual(Test.callsPerCFlow, 1, "1 call for each cflow");

	new Test().go();
	Tester.checkEqual(Test.cflowObjects, 2, "2nd cflow");
	Tester.checkEqual(Test.callsPerCFlow, 1, "1 call for each cflow");
    }
}

class Test {
    static int cflowObjects = 0;
    static int callsPerCFlow = 0;

    void go(){
	foo();
    }

    void foo(){}
}

aspect A percflow(target(Test) && call(void go())) {

    { Test.cflowObjects++; }
    { Test.callsPerCFlow = 0; }

    //before(): instanceof(Test) && calls(void Object.*()){ Test.callsPerCFlow++; }
    before(): within(Test) && call(void Object+.*(..)) {
        Test.callsPerCFlow++;
    }
}