import org.aspectj.testing.Tester;

public class CallsAndLocalClasses {
    public static void main(String[] args) {
        Runnable r = new Outer().makeRunnable();
        r.run();

        Outer o = new Outer();
        o.toString();
        ((Comparable)o).toString();

        Tester.check("run from Outer");
        Tester.check("m");
        Tester.check("before run");
        Tester.check("before m");
    }
}


class Outer implements Comparable {
    public int compareTo(Object other) { Tester.note("m"); return 0; }

    public Runnable makeRunnable() {
        return new Runnable() {
                public void run() {
                    Tester.note("run from Outer");
                    compareTo(this);
                }
            };
    }
}

final class Foo {
    public String toString() { return "Foo"; }
}

aspect A {
    before(): call(void Runnable.run()) {
        Tester.note("before run");
    }
    before(): call(int compareTo(Object)) {
        Tester.note("before m");
    }
    before(): call(String Object.toString()) {
        System.out.println("before toString");
    }
}