def initialize(*args)
@handler, @id = nil
case args.size
when 2 then @handler, @id = args
when 1 then
@id = String.try_convert(args[0]) || (args[0].to_s if args[0].is_a? Symbol)
@handler = args[0] unless @id
when 0 then
else raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0..2"
end
@adapter = Handler::Adapter.adapt(@handler) || Handler::MessagingAdapter.new(nil)
@id = (@id || SecureRandom.uuid).freeze
@work = Queue.new
@work << :start
@work << :select
@wake = SelectWaker.new
@auto_stop = true
@work_queue = WorkQueue.new(self)
@lock = Mutex.new
@active = 0
@selectable = Set.new
@running = 0
@stopped = false
@stop_err = nil
@panic = nil
end