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