Если отрисовка для всех объектов одинаковая, тогда можно проще:

Основной модуль:
## Код:
```
MODULE PrivViews;

IMPORT
   Views;
   
TYPE
   Drawer* = PROCEDURE (v : View; f : Views.Frame; l, t, r, b : INTEGER);

   View* = POINTER TO RECORD(Views.View)
      d : Drawer
   END;

PROCEDURE DefDraw (v : View; f : Views.Frame; l, t, r, b : INTEGER);
BEGIN
END DefDraw;

PROCEDURE (v : View) Restore* (f : Views.Frame; l, t, r, b : INTEGER);
BEGIN
   v.d(v, f, l, t, r, b)
END Restore;
   
PROCEDURE SetDrawer* (v : View; d : Drawer);
BEGIN
   ASSERT (v # NIL, 20);
   ASSERT (d # NIL, 21);
   v.d := d
END SetDrawer;

PROCEDURE New* () : View;
VAR res : View;
BEGIN
   NEW(res); SetDrawer(res, DefDraw); RETURN res
END New;

PROCEDURE Deposit*;
BEGIN
   Views.Deposit(New())
END Deposit;

END PrivViews.
```


Модуль рисователей:
## Код:
```
MODULE PrivViewDrawers;

IMPORT
   PrivViews, Views;
   
PROCEDURE SinDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER);
BEGIN
END SinDrawer;

PROCEDURE CosDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER);
BEGIN
END CosDrawer;

PROCEDURE TanDrawer (v : PrivViews.View; f : Views.Frame; l, t, r, b : INTEGER);
BEGIN
END TanDrawer;

PROCEDURE SetSinDrawer* (v : Views.View);
BEGIN
   WITH v : PrivViews.View DO
      PrivViews.SetDrawer(v, SinDrawer)
   ELSE
   END
END SetSinDrawer;

PROCEDURE SetCosDrawer* (v : Views.View);
BEGIN
   WITH v : PrivViews.View DO
      PrivViews.SetDrawer(v, CosDrawer)
   ELSE
   END
END SetCosDrawer;

PROCEDURE SetTanDrawer* (v : Views.View);
BEGIN
   WITH v : PrivViews.View DO
      PrivViews.SetDrawer(v, TanDrawer)
   ELSE
   END
END SetTanDrawer;

END PrivViewDrawers.
```


Если в предыдущем варианте каждому объекту создавался свой рисователь, то здесь они все общие. Зато параметры рисования либо одинаковые у всех, либо должны храниться непосредственно в объекте