ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent.pm (file contents):
Revision 1.108 by root, Sat May 10 00:22:02 2008 UTC vs.
Revision 1.112 by root, Sat May 10 01:04:42 2008 UTC

549Returns C<$AnyEvent::MODEL>, forcing autodetection of the event model 549Returns C<$AnyEvent::MODEL>, forcing autodetection of the event model
550if necessary. You should only call this function right before you would 550if necessary. You should only call this function right before you would
551have created an AnyEvent watcher anyway, that is, as late as possible at 551have created an AnyEvent watcher anyway, that is, as late as possible at
552runtime. 552runtime.
553 553
554=item $guard = AnyEvent::post_detect { BLOCK }
555
556Arranges for the code block to be executed as soon as the event model is
557autodetected (or immediately if this has already happened).
558
559If called in scalar or list context, then it creates and returns an object
560that automatically removes the callback again when it is destroyed. See
561L<Coro::BDB> for a case where this is useful.
562
554=item @AnyEvent::detect 563=item @AnyEvent::post_detect
555 564
556If there are any code references in this array (you can C<push> to it 565If there are any code references in this array (you can C<push> to it
557before or after loading AnyEvent), then they will called directly after 566before or after loading AnyEvent), then they will called directly after
558the event loop has been chosen. 567the event loop has been chosen.
559 568
560You should check C<$AnyEvent::MODEL> before adding to this array, though: 569You should check C<$AnyEvent::MODEL> before adding to this array, though:
561if it contains a true value then the event loop has already been detected, 570if it contains a true value then the event loop has already been detected,
562and the array will be ignored. 571and the array will be ignored.
572
573Best use C<AnyEvent::post_detect { BLOCK }> instead.
563 574
564=back 575=back
565 576
566=head1 WHAT TO DO IN A MODULE 577=head1 WHAT TO DO IN A MODULE
567 578
709 [POE::Kernel:: => AnyEvent::Impl::POE::], # lasciate ogni speranza 720 [POE::Kernel:: => AnyEvent::Impl::POE::], # lasciate ogni speranza
710); 721);
711 722
712our %method = map +($_ => 1), qw(io timer signal child condvar one_event DESTROY); 723our %method = map +($_ => 1), qw(io timer signal child condvar one_event DESTROY);
713 724
714our @detect; 725our @post_detect;
726
727sub post_detect(&) {
728 my ($cb) = @_;
729
730 if ($MODEL) {
731 $cb->();
732
733 1
734 } else {
735 push @post_detect, $cb;
736
737 defined wantarray
738 ? bless \$cb, "AnyEvent::Util::Guard"
739 : ()
740 }
741}
742
743sub AnyEvent::Util::Guard::DESTROY {
744 @post_detect = grep $_ != ${$_[0]}, @post_detect;
745}
715 746
716sub detect() { 747sub detect() {
717 unless ($MODEL) { 748 unless ($MODEL) {
718 no strict 'refs'; 749 no strict 'refs';
719 750
760 } 791 }
761 792
762 unshift @ISA, $MODEL; 793 unshift @ISA, $MODEL;
763 push @{"$MODEL\::ISA"}, "AnyEvent::Base"; 794 push @{"$MODEL\::ISA"}, "AnyEvent::Base";
764 795
765 (shift @detect)->() while @detect; 796 (shift @post_detect)->() while @post_detect;
766 } 797 }
767 798
768 $MODEL 799 $MODEL
769} 800}
770 801

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines