Como chamar um super método de objeto Oracle PL / SQL

Eu gostaria de chamar um método PL / SQL substituído. Aqui está um exemplo:

-- super class
create or replace type test as object
(
  n number,
  member procedure proc(SELF in out nocopy test, s varchar2)
)
alter type test not final
/

create or replace type body test is
  member procedure proc(SELF in out nocopy test, s varchar2) is
  begin
    dbms_output.put_line('test1: n='||nvl(self.n, 'null')||' s='||s);
    self.n := to_number(s);
  end;
end;
/

-- derived class
create or replace type test2 under test
(
  overriding member procedure proc(SELF in out nocopy test2, s varchar2)
)
/

gora, eu quero invocar a versão herdada doproc método. Quando tento fazer um elenco explícito comotreat(self as test).proc(s); não será compilado por causa de PLS-00363: a expressão 'SYS_TREAT' não pode ser utilizada como destino de atribuição

O corpo do tipo é compilado quando uso uma variável local:

create or replace type body test2 is
  overriding member procedure proc(SELF in out nocopy test2, s varchar2) is 
    O test;
  begin
    O := treat(self as test);
    O.proc(s);
  end;
end;
/

Mas quando executo o meu exemplo como este

declare
  obj test2;
begin
  obj := test2(0);
  obj.proc('1');
end;

... lança ORA-21780: Número máximo de durações de objetos excedid

Existe alguma maneira de chamar test :: proc (sem serializar / desserializar

E ... depois que proc foi chamado, como pode qualquer atributo alterado (ou seja,n) seja refletido emobj ?

Atualiza (Obrigado, tbone):

Alterei a organização dos meus métodos usando métodos de modelo ('before' e 'after'). Eu os adiciono sempre que preciso estender um método.

create or replace type test as object
(
  n number,
  member procedure proc      (SELF in out nocopy test, s varchar2),
  member procedure afterProc (SELF in out nocopy test, s varchar2)
  member procedure beforeProc(SELF in out nocopy test, s varchar2),
)
not final
/

create or replace type body test is
  member procedure proc(SELF in out nocopy test, s varchar2) is
  begin
    beforeProc(s);
    dbms_output.put_line('test1: n='||nvl(n, 'null')||' s='||s);
    n := to_number(s);
    afterProc(s);
  end;
  member procedure afterProc (SELF in out nocopy test, s varchar2) is begin null; end;
  member procedure beforeProc(SELF in out nocopy test, s varchar2) is begin null; end;
end;
/

questionAnswers(2)

yourAnswerToTheQuestion