import org.aspectj.testing.Tester;

public aspect Driver {

  static boolean t1, t2, t3, t4;

  public static void main(String[] args) { test(); }

  public static void test() {

    Foo f1 = new Foo();

    f1.m1("foo");
    f1.m2(1);    
    f1.m3("foo");    
    f1.m3(1);    

    Tester.check(t1, "finding m1(String)");
    Tester.check(t2, "finding m2(int)");
    Tester.check(t3, "finding m3(String)");
    Tester.check(t4, "finding m3(int)");
  }

   before(String x): target(Foo) && call(void m1(String)) && args(x) {
      t1 = true;
  }

   before(int x): target(Foo) && call(void m2(int)) && args(x) {
      t2 = true; 
  }

   before(String x): target(Foo) && call(void m3(String)) && args(x) {
      t3 = true; 
  }

   before(int x): target(Foo) && call(void m3(int)) && args(x) {
      t4 = true; 
  }
}

class Foo {
  void m1(String x) { }
  void m2(int x) { }
  void m3(String x) { }
  void m3(int x) { }
}