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.1 by root, Wed Apr 27 01:26:44 2005 UTC vs.
Revision 1.3 by root, Thu Dec 1 21:19:58 2005 UTC

1=head1 NAME 1=head1 NAME
2 2
3AnyEvent - ??? 3AnyEvent - provide framework for multiple event loops
4
5Event, Coro, Glib, Tk - various supported event loops
4 6
5=head1 SYNOPSIS 7=head1 SYNOPSIS
6 8
9use AnyEvent;
10
11 my $w = AnyEvent->timer (fh => ..., poll => "[rw]+", cb => sub {
12 my ($poll_got) = @_;
13 ...
14 });
15 my $w = AnyEvent->io (after => $seconds, cb => sub {
16 ...
17 });
18
19 # watchers get canceled whenever $w is destroyed
20 # only one watcher per $fh and $poll type is allowed
21 # (i.e. on a socket you cna have one r + one w or one rw
22 # watcher, not any more.
23 # timers can only be used once
24
25 my $w = AnyEvent->condvar; # kind of main loop replacement
26 # can only be used once
27 $w->wait; # enters main loop till $condvar gets ->send
28 $w->broadcast; # wake up waiting and future wait's
29
7=head1 DESCRIPTION 30=head1 DESCRIPTION
31
32L<AnyEvent> provides an identical interface to multiple event loops. This
33allows module authors to utilizy an event loop without forcing module
34users to use the same event loop (as only a single event loop can coexist
35peacefully at any one time).
36
37The interface itself is vaguely similar but not identical to the Event
38module.
39
40On the first call of any method, the module tries to detect the currently
41loaded event loop by probing wether any of the following modules is
42loaded: L<Coro::Event>, L<Event>, L<Glib>, L<Tk>. The first one found is
43used. If none is found, the module tries to load these modules in the
44order given. The first one that could be successfully loaded will be
45used. If still none could be found, it will issue an error.
8 46
9=over 4 47=over 4
10 48
11=cut 49=cut
12 50
13package AnyEvent; 51package AnyEvent;
14 52
53no warnings;
54use strict 'vars';
15use Carp; 55use Carp;
16 56
17$VERSION = 0.1; 57our $VERSION = 0.2;
58our $MODEL;
18 59
19no warnings; 60our $AUTOLOAD;
61our @ISA;
20 62
21my @models = ( 63my @models = (
22 [Coro => Coro::Event::], 64 [Coro => Coro::Event::],
23 [Event => Event::], 65 [Event => Event::],
24 [Glib => Glib::], 66 [Glib => Glib::],
25 [Tk => Tk::], 67 [Tk => Tk::],
26); 68);
27 69
70our %method = map +($_ => 1), qw(io timer condvar broadcast wait cancel DESTROY);
71
28sub AUTOLOAD { 72sub AUTOLOAD {
29 $AUTOLOAD =~ s/.*://; 73 $AUTOLOAD =~ s/.*://;
30 74
75 $method{$AUTOLOAD}
76 or croak "$AUTOLOAD: not a valid method for AnyEvent objects";
77
78 unless ($MODEL) {
79 # check for already loaded models
31 for (@models) { 80 for (@models) {
32 my ($model, $package) = @$_; 81 my ($model, $package) = @$_;
33 if (defined ${"$package\::VERSION"}) { 82 if (scalar keys %{ *{"$package\::"} }) {
34 $EVENT = "AnyEvent::Impl::$model"; 83 eval "require AnyEvent::Impl::$model"
35 eval "require $EVENT"; die if $@; 84 or die;
36 goto &{"$EVENT\::$AUTOLOAD"}; 85
86 last if $MODEL;
87 }
88 }
89
90 unless ($MODEL) {
91 # try to load a model
92
93 for (@models) {
94 my ($model, $package) = @$_;
95 eval "require AnyEvent::Impl::$model"
96 or die;
97
98 last if $MODEL;
99 }
100
101 $MODEL
102 or die "No event module selected for AnyEvent and autodetect failed. Install any one of these modules: Coro, Event, Glib or Tk.";
37 } 103 }
38 } 104 }
39 105
40 for (@models) { 106 @ISA = $MODEL;
41 my ($model, $package) = @$_; 107
42 $EVENT = "AnyEvent::Impl::$model"; 108 my $class = shift;
43 if (eval "require $EVENT") { 109 $class->$AUTOLOAD (@_);
44 goto &{"$EVENT\::$AUTOLOAD"}; 110}
111
112=back
113
114=head1 EXAMPLE
115
116The following program uses an io watcher to read data from stdin, a timer
117to display a message once per second, and a condvar to exit the program
118when the user enters quit:
119
120 use AnyEvent;
121
122 my $cv = AnyEvent->condvar;
123
124 my $io_watcher = AnyEvent->io (fh => \*STDIN, poll => 'r', cb => sub {
125 warn "io event <$_[0]>\n"; # will always output <r>
126 chomp (my $input = <STDIN>); # read a line
127 warn "read: $input\n"; # output what has been read
128 $cv->broadcast if $input =~ /^q/i; # quit program if /^q/i
129 });
130
131 my $time_watcher; # can only be used once
132
133 sub new_timer {
134 $timer = AnyEvent->timer (after => 1, cb => sub {
135 warn "timeout\n"; # print 'timeout' about every second
136 &new_timer; # and restart the time
45 } 137 });
46 } 138 }
47 139
48 die "No event module selected for AnyEvent and autodetect failed. Install any of these: Coro, Event, Glib or Tk."; 140 new_timer; # create first timer
49}
50 141
511; 142 $cv->wait; # wait until user enters /^q/i
52 143
144=head1 SEE ALSO
145
146L<Coro::Event>, L<Coro>, L<Event>, L<Glib::Event>, L<Glib>,
147L<AnyEvent::Impl::Coro>,
148L<AnyEvent::Impl::Event>,
149L<AnyEvent::Impl::Glib>,
150L<AnyEvent::Impl::Tk>.
151
152=head1
153
154=cut
155
1561
157

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines