Review and changes from Jocelyn Fiat

I see that you forgot the semantic of "once" however it is simple, ...

a "once" routine is executed only "once" ...that's it ;)

however, there are tiny details such as  "once per thread" and "once per process" ... by default this is once per thread .. i.e a once routine is executed only once in the same thread.
with once per process .. this ensures it is execute only once .. during the execution of your application.
And also details about genericity and so on ...  class FOO [G] feature my_once: BAR once ... end end ... the my_once is attached to each derivation of FOO .. so  {FOO [INTEGER]} int_foo.my_once   and {FOO [STRING]} str_foo.my_once will not return the same object ...
but 
    f1,f2: FOO [STRING]  
     ....
    f1.my_once and f2.my_once will return the same object.

Even if it possible to use once procedure, this is rare, usually we are using mostly once function.
Once procedure can be used for some initialization.

So here, the easier would be 
private_key: STRING
   once
           -- compute the Result as a private key only once
   end