--- AnyEvent/lib/AnyEvent.pm 2008/05/10 00:45:18 1.109 +++ AnyEvent/lib/AnyEvent.pm 2008/05/10 20:30:35 1.113 @@ -551,12 +551,16 @@ have created an AnyEvent watcher anyway, that is, as late as possible at runtime. -=item AnyEvent::on_detect { BLOCK } +=item $guard = AnyEvent::post_detect { BLOCK } Arranges for the code block to be executed as soon as the event model is autodetected (or immediately if this has already happened). -=item @AnyEvent::on_detect +If called in scalar or list context, then it creates and returns an object +that automatically removes the callback again when it is destroyed. See +L for a case where this is useful. + +=item @AnyEvent::post_detect If there are any code references in this array (you can C to it before or after loading AnyEvent), then they will called directly after @@ -566,7 +570,7 @@ if it contains a true value then the event loop has already been detected, and the array will be ignored. -Best use C instead. +Best use C instead. =back @@ -629,10 +633,6 @@ Provide read and write buffers and manages watchers for reads and writes. -=item L - -Provides a means to do non-blocking connects, accepts etc. - =item L Provides a simple web application server framework. @@ -667,19 +667,20 @@ Has special support for AnyEvent via L. -=item L +=item L, L -The lambda approach to I/O - don't ask, look there. Can use AnyEvent. +Truly asynchronous I/O, should be in the toolbox of every event +programmer. AnyEvent::AIO transparently fuses IO::AIO and AnyEvent +together. -=item L +=item L, L -Truly asynchronous I/O, should be in the toolbox of every event -programmer. Can be trivially made to use AnyEvent. +Truly asynchronous Berkeley DB access. AnyEvent::AIO transparently fuses +IO::AIO and AnyEvent together. -=item L +=item L -Truly asynchronous Berkeley DB access. Can be trivially made to use -AnyEvent. +The lambda approach to I/O - don't ask, look there. Can use AnyEvent. =back @@ -718,16 +719,28 @@ our %method = map +($_ => 1), qw(io timer signal child condvar one_event DESTROY); -our @on_detect; +our @post_detect; + +sub post_detect(&) { + my ($cb) = @_; -sub on_detect(&) { if ($MODEL) { - $_[0]->(); + $cb->(); + + 1 } else { - push @on_detect, $_[0]; + push @post_detect, $cb; + + defined wantarray + ? bless \$cb, "AnyEvent::Util::Guard" + : () } } +sub AnyEvent::Util::Guard::DESTROY { + @post_detect = grep $_ != ${$_[0]}, @post_detect; +} + sub detect() { unless ($MODEL) { no strict 'refs'; @@ -777,7 +790,7 @@ unshift @ISA, $MODEL; push @{"$MODEL\::ISA"}, "AnyEvent::Base"; - (shift @on_detect)->() while @on_detect; + (shift @post_detect)->() while @post_detect; } $MODEL