(load "../common")

(defstruct base nil
  others
  id
  (:static counter 0)
  (:postinit (me) (set me.id (inc me.counter)))
  (:fini (me)
    (put-line `@(typeof me):@{me.id} finalized`)
    [mapdo call-finalizers me.others]))

(defstruct derived base
  (:fini (me)
    (put-line `@(typeof me):@{me.id} derived fini`))
  (:postfini (me)
    (put-line `@(typeof me):@{me.id} derived postfini`)))

(unwind-protect
  (with-objects ((b (new base others (mapcar (ret (new derived)) (range 1 20)))))
    (put-line "inside with-objects"))
  (put-line "after with-objects"))

(mapcar (ret (new derived)) (range 1 20))
(sys:gc t)

(defstruct multi ()
  (:init (me)
    (put-line `@{%fun%}: 1`))
  (:init (me)
    (put-line `@{%fun%}: 2`))
  (:postinit (me)
    (put-line `@{%fun%}: 1`))
  (:postinit (me)
    (put-line `@{%fun%}: 2`))
  (:fini (me)
    (put-line `@{%fun%}: 1`))
  (:fini (me)
    (put-line `@{%fun%}: 2`))
  (:postfini (me)
    (put-line `@{%fun%}: 1`))
  (:postfini (me)
    (put-line `@{%fun%}: 2`)))

(with-objects ((m (new multi))))