-module(doctor). -export([loop/0]). loop() -> process_flag(trap_exit, true), receive die -> exit(doctor); {monitorize, Process} -> io:format("Doctor: monitoring ~p.~n", [Process]), link(Process); new_mon -> io:format("Doctor: starting new monitor.~n"), register(mon, spawn_link(monitor_doctor, loop, [])), mon ! {mon, self()}; new_rev -> io:format("Doctor: starting new revolver.~n"), register(revolver, spawn_link(roulette, loop, [])); {'EXIT', _, mon} -> io:format("Doctor: oh SWEET JESUS CHRIST, my monitor just DIED!~n"), self() ! new_mon; {'EXIT', _, revolver} -> io:format("Doctor: The shooter died, restarting...~n"), self() ! new_rev end, loop().