So how does the closure know what $self it is using? As far as I understand, $self will be out of scope when I return from "new". Or is a new reference to the "new" block saved each time it runs?
You missed the key point - the anonymous subroutine is a closure because it "captures" the $type, $class and $self instances. So when you call the function later the $self variable is still accessible from inside $closure thus it all works.