MODULE Showcase19; // Session showcase: class init body + sibling method calls. // // The Accumulator class sets a global scale factor in its BEGIN body // (run once at startup); its methods call each other by bare name -- // chains of sibling calls on THIS. // Expected ExitCode: 42. IMPORT TextIO, Conversions; VAR scale : INTEGER; (* set by Accumulator's init body *) TYPE CLASS Accumulator; total : INTEGER; PROCEDURE Init(v : INTEGER); PROCEDURE Add(v : INTEGER); PROCEDURE AddScaled(v : INTEGER); (* sibling: Add *) PROCEDURE AddPair(a, b : INTEGER); (* sibling: AddScaled *) PROCEDURE Value() : INTEGER; END Accumulator; CLASS IMPLEMENTATION Accumulator; PROCEDURE Init(v : INTEGER); BEGIN total := v END Init; PROCEDURE Add(v : INTEGER); BEGIN total := total + v END Add; PROCEDURE AddScaled(v : INTEGER); BEGIN Add(v * scale) END AddScaled; (* sibling call on THIS *) PROCEDURE AddPair(a, b : INTEGER); BEGIN AddScaled(a); AddScaled(b) END AddPair; PROCEDURE Value() : INTEGER; BEGIN RETURN total END Value; BEGIN scale := 10 (* class init body *) END Accumulator; VAR ExitCode : INTEGER; VAR acc : Accumulator; VAR line, num : ARRAY [0 .. 63] OF CHAR; BEGIN ExitCode := 0; acc.Init(0); acc.AddPair(2, 2); (* AddScaled -> Add: +20 +20 = 40 *) acc.Add(2); (* +2 = 42 *) Conversions.IntToStr(acc.Value(), num); line := "showcase19 total=" + num; TextIO.WriteString(line); TextIO.WriteLn; IF acc.Value() = 42 THEN ExitCode := 42 ELSE ExitCode := 1 END END Showcase19.