Unit Test; Interface type pFoo = ^tFoo; pBar = ^tBar; tFoo = object public Constructor init; Destructor fini; virtual; Function getBar: pBar; virtual; private fBar: pBar; end (* tFoo *); tBar = object public Constructor init; Destructor fini; virtual; Function getBaz: integer; virtual; end (* tBar *); var gFoo: pFoo; gBar: pBar; Function getFoo: pFoo; Procedure foobarbaz; Implementation Function getFoo = result: pFoo; begin (* getFoo *) result:= gFoo; end (* getFoo *); Procedure foobarbaz; begin (* foobarbaz *) if getFoo^ .getBar^ .getBaz = gBar^ .getBaz then writeln ( ':-)' ); end (* foobarbaz *); Constructor tFoo.init; begin (* tFoo.init *) fBar:= new ( pBar, init ); end (* tFoo.init *); Destructor tFoo.fini; begin (* tFoo.fini *) dispose ( fBar, fini ); end (* tFoo.fini *); Function tFoo.getBar = result: pBar; begin (* tFoo.getBar *) result:= fBar; end (* tFoo.getBar *); Constructor tBar.init; begin (* tBar.init *) end (* tBar.init *); Destructor tBar.fini; begin (* tBar.fini *) end (* tBar.fini *); Function tBar.getBaz = result: integer; begin (* tBar.getBaz *) result:= 42; end (* tBar.getBaz *); end.