class Base1 {
    private int value1;
    private int value2;

    Base1(int value1, int value2) {
        self.value1 = value1;
        self.value2 = value2;
    }

    void show() with void block() {
        Clover.println("Base::show");

        Clover.println("self.value1 --> " + self.value1.toString());
        Clover.println("self.value2 --> " + self.value2.toString());

        block();
    }

    void show2() with int block() {
        Clover.println("Base::show2");

        Clover.println("self.value1 --> " + self.value1.toString());
        Clover.println("self.value2 --> " + self.value2.toString());

        int a = block().get2();

        Clover.println("block returns " + a.toString());
    }

    static void show() with void block() {
        Clover.println("Base::show() static");
        block();
    }
}

class Extended1 extends Base1 {
    Extended1(int value1, int value2) {
        super(value1, value2);
    }

    void show() with void block() {
        Clover.println("Extended1::show");

        super() with block;
    }

    void show2() {
        Clover.println("Extended1::show2");

        super() int{ 
            Clover.println("calling super with block");
            return 1;
        }
    }

    static void show() with void block() {
        Clover.println("Extended1::show() static");

        Base1.show() {
            Clover.println("block called");
        }
    }
}

