1 module nextdemo;
2 
3 import std.stdio;
4 import openmethods;
5 
6 interface Vehicle
7 {
8 }
9 
10 class Car : Vehicle
11 {
12 }
13 
14 class Truck : Vehicle
15 {
16 }
17 
18 class Inspector
19 {
20 }
21 
22 class StateInspector : Inspector
23 {
24 }
25 
26 void inspect(virtual!Vehicle, virtual!Inspector, ref int checks);
27 
28 @method
29 void _inspect(Vehicle v, Inspector i, ref int checks)
30 {
31   writeln("Inspect vehicle.");
32   ++checks;
33 }
34 
35 @method
36 void _inspect(Car v, Inspector i, ref int checks)
37 {
38   next!inspect(v, i, checks); // next calls the next most methodd method
39   ++checks;
40   writeln("Inspect seat belts.");
41 }
42 
43 @method
44 void _inspect(Car v, StateInspector i, ref int checks)
45 {
46   next!inspect(v, i, checks);
47   ++checks;
48   writeln("Check insurance.");
49 }
50 
51 void main() {
52   int checks;
53   Vehicle car = new Car;
54   Inspector inspector = new StateInspector;
55   inspect(car, inspector, checks); // Inspect vehicle. Inspect seat belts. Check insurance.
56   assert(checks == 3);
57 }
58 
59 mixin(registerMethods);