You can simply use a recursive function.
(sorry, no working examples, I'm on mobile)
Something like (pseudo code)
function foo(my: myclass)
begin
for x being 0 to my.optionals.count - 1
begin
If my.optionals[x].items <> nil do
foo(my.optionals[x].items)
Handle my.optionals[x].rest
end
Handle my.additional
end
This should give you pre order traversal.