Current File : //usr/local/share/man/man3/POE.3pm |
.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
. if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{\
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\" ========================================================================
.\"
.IX Title "POE 3"
.TH POE 3 "2022-03-23" "perl v5.26.3" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
POE \- portable multitasking and networking framework for any event loop
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 1
\& #!/usr/bin/perl
\&
\& use warnings;
\& use strict;
\&
\& use POE; # Auto\-includes POE::Kernel and POE::Session.
\&
\& sub handler_start {
\& my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
\& print "Session ", $session\->ID, " has started.\en";
\& $heap\->{count} = 0;
\& $kernel\->yield(\*(Aqincrement\*(Aq);
\& }
\&
\& sub handler_increment {
\& my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION];
\& print "Session ", $session\->ID, " counted to ", ++$heap\->{count}, ".\en";
\& $kernel\->yield(\*(Aqincrement\*(Aq) if $heap\->{count} < 10;
\& }
\&
\& sub handler_stop {
\& print "Session ", $_[SESSION]\->ID, " has stopped.\en";
\& }
\&
\& for (1..10) {
\& POE::Session\->create(
\& inline_states => {
\& _start => \e&handler_start,
\& increment => \e&handler_increment,
\& _stop => \e&handler_stop,
\& }
\& );
\& }
\&
\& POE::Kernel\->run();
\& exit;
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\s-1POE\s0 is a framework for cooperative, event driven multitasking and
networking in Perl. Other languages have similar frameworks. Python
has Twisted. \s-1TCL\s0 has \*(L"the event loop\*(R".
.PP
\&\s-1POE\s0 provides a unified interface for several other event loops,
including \fBselect()\fR, IO::Poll, Glib, Gtk, Tk,
Wx, and Gtk2. Many of these event loop interfaces were written
by others, with the help of POE::Test::Loops. They may be found on
the \s-1CPAN.\s0
.PP
\&\s-1POE\s0 achieves its high degree of portability to different operating
systems and Perl versions by being written entirely in Perl. \s-1CPAN\s0
hosts optional \s-1XS\s0 modules for \s-1POE\s0 if speed is more desirable than
portability.
.PP
\&\s-1POE\s0 is designed in layers. Each layer builds atop the lower level
ones. Programs are free to use \s-1POE\s0 at any level of abstraction, and
different levels can be mixed and matched seamlessly within a single
program. Remember, though, that higher-level abstractions often
require more resources than lower-level ones. The conveniences they
provide are not free.
.PP
\&\s-1POE\s0's bundled abstraction layers are the tip of a growing iceberg.
Sprocket, POE::Stage, and other \s-1CPAN\s0 distributions
build upon this work. You're encouraged to look around.
.PP
No matter how high you go, though, it all boils down to calls to
POE::Kernel. So your down-to-earth code can easily
cooperate with stratospheric systems.
.SS "Layer 1: Kernel and Sessions"
.IX Subsection "Layer 1: Kernel and Sessions"
The lowest public layer is comprised of POE::Kernel,
POE::Session, and other session types.
.PP
POE::Kernel does most of the heavy lifting. It provides a portable
interface for filehandle activity detection, multiple alarms and other
timers, signal handling, and other less-common features.
.PP
POE::Session and derived classes encapsulate the notion of an event
driven task. They also customize event dispatch to a particular
calling convention. \s-1POE::NFA\s0, for example, is more of a proper state
machine. The \s-1CPAN\s0 has several other kinds of sessions.
.PP
Everything ultimately builds on these classes or the concepts they
implement. If you're short on time, the things to read besides this
are POE::Kernel and POE::Session.
.SS "Layer 2: Wheels, Filters, and Drivers"
.IX Subsection "Layer 2: Wheels, Filters, and Drivers"
POE::Wheel objects are dynamic mix-ins for POE::Session instances. These
\&\*(L"wheels\*(R" perform very common, generic tasks in a highly reusable and
customizable way. POE::Wheel::ReadWrite, for
example, implements non-blocking buffered I/O. Nearly everybody needs this,
so why require people to reinvent it all the time?
.PP
POE::Filter objects customize wheels in a modular way. Filters act as
I/O layers, turning raw streams into structured data, and serializing
structures into something suitable for streams. The \s-1CPAN\s0 also has several
of these.
.PP
Drivers are where the wheels meet the road. In this case, the road is
some type of file handle. Drivers do the actual reading and writing
in a standard way so wheels don't need to know the difference between
\&\fBsend()\fR and \fBsyswrite()\fR.
.PP
POE::Driver objects get relatively short shrift because very few are
needed. The most common driver, POE::Driver::SysRW is ubiquitous and
also the default, so most people will never need to specify one.
.SS "Layer 3: Components"
.IX Subsection "Layer 3: Components"
POE::Component classes are essentially Perl classes that use \s-1POE\s0 to
perform tasks in a non-blocking or cooperative way. This is a very
broad definition, and \s-1POE\s0 components are all over the abstraction map.
.PP
Many components, such as POE::Component::Server::SMTP, encapsulate the
generic details of an entire application. Others perform rather
narrow tasks, such as POE::Component::DirWatch::Object.
.PP
\&\s-1POE\s0 components are often just plain Perl objects. The previously
mentioned POE::Component::DirWatch::Object uses Moose. Other object
and meta-object frameworks are compatible.
.PP
Also of interest is POE::Component::Generic, which allows you to create
a \s-1POE\s0 component from nearly any blocking module.
.PP
There are quite a lot of components on the \s-1CPAN.\s0
<http://search.cpan.org/search?query=poe+component&mode=all>
.SS "Layer 4 and Beyond: Frameworks and Object Metaphors"
.IX Subsection "Layer 4 and Beyond: Frameworks and Object Metaphors"
It's possible to abstract \s-1POE\s0 entirely behind a different framework.
In fact we encourage people to write domain-specific abstractions that
entirely hide \s-1POE\s0 if necessary. The nice thing here is that even at
these high levels of abstraction, things will continue to interoperate
all the way down to layer 1.
.PP
Two examples of ultra-high level abstraction are Sprocket, a networking
framework that does its own thing, and POE::Stage, which is \s-1POE\s0's
creator's attempt to formalize and standardize \s-1POE\s0 components.
.PP
It is also possible to communicate between \s-1POE\s0 processes. This is called
\&\s-1IKC,\s0 for \fIInter-Kernel Communication\fR. There are a few \s-1IKC\s0 components on
the \s-1CPAN\s0 (<http://search.cpan.org/search?query=IKC&mode=all>), notably
POE::Component::IKC and \s-1POE::TIKC\s0.
.SS "Layer 0: \s-1POE\s0's Internals"
.IX Subsection "Layer 0: POE's Internals"
\&\s-1POE\s0's layered architecture continues below the surface. \s-1POE\s0's guts
are broken into specific POE::Loop classes for each event
loop it supports. Internals are divided up by type, giving
POE::Resource classes for Aliases, Controls, Events,
Extrefs, FileHandles, SIDs, Sessions and Signals.
.PP
POE::Kernel's APIs are extensible through \s-1POE::API\s0 mix-in classes.
Some brave souls have even published new APIs on \s-1CPAN,\s0 such as
POE::API::Peek (which gives you access to some of the internal
POE::Resource methods).
.PP
By design, it's possible to implement new POE::Kernel guts by creating
another POE::Resource class. One can then expose the functionality with
a new \s-1POE::API\s0 mix-in.
.SH "DOCUMENTATION ROADMAP"
.IX Header "DOCUMENTATION ROADMAP"
You're reading the main \s-1POE\s0 documentation. It's the general entry
point to the world of \s-1POE.\s0 You already know this, however, so let's
talk about something more interesting.
.SS "Basic Features"
.IX Subsection "Basic Features"
\&\s-1POE\s0's basic features are documented mainly in POE::Kernel and
POE::Session. Methods are documented in the classes that implement
them. Broader concepts are covered in the most appropriate class, and
sometimes they are divided among classes that share in their
implementation.
.SS "Basic Usage"
.IX Subsection "Basic Usage"
Basic usage, even for \s-1POE\s0.pm, is documented in POE::Kernel. That's
where most of \s-1POE\s0's work is done, and \s-1POE\s0.pm is little more than a
class loader.
.ie n .SS "@_[\s-1KERNEL, HEAP,\s0 etc.]"
.el .SS "\f(CW@_\fP[\s-1KERNEL, HEAP,\s0 etc.]"
.IX Subsection "@_[KERNEL, HEAP, etc.]"
Event handler calling conventions, that weird \f(CW@_[KERNEL, HEAP]\fR
stuff, is documented in POE::Session. That's because POE::Session
implements the calling convention, and other session types often do it
differently.
.SS "Base Classes Document Common Features"
.IX Subsection "Base Classes Document Common Features"
The POE::Wheel, POE::Driver,
POE::Filter, and POE::Component base
classes describe what's common among each class. It's a good idea to at
least skim the base class documentation since the subclasses tend not to
rehash the common things.
.PP
POE::Queue, POE::Resource, and POE::Loop document the
concepts and sometimes the standard interfaces behind multiple
subclasses. You're encouraged to have a look.
.SS "Helper Classes"
.IX Subsection "Helper Classes"
\&\s-1POE\s0 includes some helper classes for portability. POE::Pipe, and its
subclasses POE::Pipe::OneWay and POE::Pipe::TwoWay are portable pipes.
.SS "Event Loop Bridges"
.IX Subsection "Event Loop Bridges"
POE::Loop documents and specifies the interface for all of \s-1POE\s0's event
loop bridges. The individual classes may document specific details,
but generally they adhere to the spec strongly enough that they don't
need to.
.PP
Many of the existing POE::Loop bridges provided in \s-1POE\s0's base
distribution will move out to separate distributions shortly. The
documentation will probably remain the same, however.
.SS "POE::Queue and POE::Queue::Array"
.IX Subsection "POE::Queue and POE::Queue::Array"
\&\s-1POE\s0's event queue is basically a priority heap implemented as an
ordered array. POE::Queue documents the standard interface for \s-1POE\s0
event queues, and POE::Queue::Array implements the ordered array
queue. Tony Cook has released POE::XS::Queue::Array, which is a
drop-in C replacement for POE::Queue::Array. You might give it a try
if you need more performance. \s-1POE\s0's event queue is some of the
hottest code in the system.
.SS "This Section Isn't Complete"
.IX Subsection "This Section Isn't Complete"
Help organize the documentation. Obviously we can't think of
everything. We're well aware of this and welcome audience
participation.
.SS "See \s-1SEE ALSO\s0"
.IX Subsection "See SEE ALSO"
Wherever possible, the \s-1SEE ALSO\s0 section will cross-reference one
module to related ones.
.SS "Don't Forget the Web"
.IX Subsection "Don't Forget the Web"
Finally, there are many \s-1POE\s0 resources on the web. The \s-1CPAN\s0 contains a
growing number of \s-1POE\s0 modules. <http://poe.perl.org/> hosts \s-1POE\s0's
wiki, which includes tutorials, an extensive set of examples,
documentation, and more. Plus it's a wiki, so you can trivially pitch
in your two cents.
.SH "SYSTEM REQUIREMENTS"
.IX Header "SYSTEM REQUIREMENTS"
\&\s-1POE\s0's basic requirements are rather light. Most are included with
modern versions of Perl, and the rest (if any) should be generally
portable by now.
.PP
Time::HiRes is highly recommended, even for older Perls that don't
include it. \s-1POE\s0 will work without it, but alarms and other features will be
much more accurate if it's included. POE::Kernel will use Time::HiRes
automatically if it's available.
.PP
POE::Filter::Reference needs a module to serialize data for transporting
it across a network. It will use Storable, FreezeThaw, \s-1YAML\s0, or
some other package with \fBfreeze()\fR and \fBthaw()\fR methods. It can also use
Compress::Zlib to conserve bandwidth and reduce latency over slow links, but
it's not required.
.PP
If you want to write web servers, you'll need to install libwww-perl, which
requires libnet. This is a small world of modules that includes
HTTP::Status, HTTP::Request,
HTTP::Date, and HTTP::Response. They are
generally good to have, and modern versions of Perl even include them.
.PP
Programs that use POE::Wheel::Curses will of course
require the Curses module, which in turn requires some sort of
curses library.
.PP
If you're using \s-1POE\s0 with Tk, you'll need Tk installed.
.PP
And other obvious things. Let us know if we've overlooked a
non-obvious detail.
.SH "COMPATIBILITY ISSUES"
.IX Header "COMPATIBILITY ISSUES"
One of \s-1POE\s0's design goals is to be as portable as possible. That's
why it's written in \*(L"Plain Perl\*(R". \s-1XS\s0 versions of \s-1POE\s0 modules are
available as third-party distributions. Parts of \s-1POE\s0 that require
nonstandard libraries are optional, and not having those libraries
should not prevent \s-1POE\s0 from installing.
.PP
Despite Chris Williams' efforts, we can't test \s-1POE\s0 everywhere. Please
see the \s-1GETTING HELP\s0 section if you run into a problem.
.PP
\&\s-1POE\s0 is expected to work on most forms of \s-1UNIX,\s0 including FreeBSD,
MacOS X, Linux, Solaris. Maybe even \s-1AIX\s0 and \s-1QNX,\s0 but we're not sure.
.PP
\&\s-1POE\s0 is also tested on Windows \s-1XP,\s0 using the latest version of
ActiveState, Strawberry and Cygwin Perl. \s-1POE\s0 is fully supported with
Strawberry Perl, as it's included in the Strawberry distribution.
.PP
\&\s-1OS/2\s0 and MacOS 9 have been reported to work in the past, but nobody
seems to be testing there anymore. Reports and patches are still
welcome.
.PP
Past versions of \s-1POE\s0 have been tested with Perl versions as far back
as 5.6.2 and as recent as \*(L"blead\*(R", today's development build. We
can no longer guarantee each release will work everywhere, but we will
be happy to work with you if you need special support for a really old
system. You can always use older \s-1POE\s0 releases that works on your version,
please check BackPAN <http://backpan.perl.org/authors/id/R/RC/RCAPUTO/>.
.PP
\&\s-1POE\s0's quality is due in large part to the fine work of Chris Williams
and the other \s-1CPAN\s0 testers. They have dedicated resources towards
ensuring \s-1CPAN\s0 distributions pass their own tests, and we watch their
reports religiously. You can, too. The latest \s-1POE\s0 test reports can
be found at <http://cpantesters.org/distro/P/POE.html>.
.PP
Thanks also go out to Benjamin Smith and the 2006 Google Summer of
Code. Ben was awarded a grant to improve \s-1POE\s0's test suite, which he
did admirably.
.SS "Windows Issues"
.IX Subsection "Windows Issues"
\&\s-1POE\s0 seems to work very nicely with Perl compiled for Cygwin. If you
must use ActiveState Perl, please use the absolute latest version.
ActiveState Perl's compatibility fluctuates from one build to another,
so we tend not to support older releases.
.PP
Windows and ActiveState Perl are considered an esoteric platform due
to the complex interactions between various versions. \s-1POE\s0 therefore
relies on user feedback and support here.
.PP
A number of people have helped bring \s-1POE\s0's Windows support this far,
through contributions of time, patches, and other resources. Some of
them are: Sean Puckett, Douglas Couch, Andrew Chen, Uhlarik Ondoej,
Nick Williams, and Chris Williams (no relation).
.SS "Linux/Unix Issues"
.IX Subsection "Linux/Unix Issues"
\fIpty woes\fR
.IX Subsection "pty woes"
.PP
Some distributions chose to not completely setup the pseudo-tty
support. This is needed for POE::Wheel::Run to interact with the
subprocess. If you see something like this while running \f(CW\*(C`make test\*(C'\fR
please look at your distribution's documentation on how to fix it. For
example, on Debian-based systems the solution was to execute
\&\*(L"sudo apt-get install udev\*(R".
.PP
.Vb 8
\& t/30_loops/io_poll/wheel_run.t ..................... 1/99
\& pty_allocate(nonfatal): posix_openpt(): No such file or directory at /usr/local/lib/perl/5.10.0/IO/Pty.pm line 24.
\& ...
\& Cannot open a pty at /home/apoc/poe/blib/lib/POE/Wheel/Run.pm line 251
\& Compilation failed in require at t/30_loops/io_poll/wheel_run.t line 24.
\& # Looks like you planned 99 tests but ran 5.
\& # Looks like your test exited with 22 just after 5.
\& t/30_loops/io_poll/wheel_run.t ..................... Dubious, test returned 22 (wstat 5632, 0x1600)
.Ve
.SS "Other Compatibility Issues"
.IX Subsection "Other Compatibility Issues"
None currently known. See \s-1GETTING HELP\s0 below if you've run into
something.
.SH "GETTING HELP"
.IX Header "GETTING HELP"
\&\s-1POE\s0's developers take pride in its quality. If you encounter a
problem, please let us know.
.SS "\s-1POE\s0's Request Tracker"
.IX Subsection "POE's Request Tracker"
You're welcome to e\-mail questions and bug reports to
<bug\-POE@rt.cpan.org>. This is not a realtime support channel,
though. If you need a more immediate response, try one of the methods
below.
.SS "\s-1POE\s0's Mailing List"
.IX Subsection "POE's Mailing List"
\&\s-1POE\s0 has a dedicated mailing list where developers and users discuss
the software and its use. You're welcome to join us. Send an e\-mail
to <poe\-help@perl.org> for subscription instructions. The subject and
message body are ignored.
.SS "\s-1POE\s0's Web Site"
.IX Subsection "POE's Web Site"
<http://poe.perl.org> contains recent information, tutorials, and
examples. It's also a wiki, so people are invited to share tips and
code snippets there as well.
.SS "\s-1POE\s0's Source Code"
.IX Subsection "POE's Source Code"
The following command will fetch the most current version of \s-1POE\s0 into
the \*(L"poe\*(R" subdirectory:
.PP
.Vb 1
\& git clone https://github.com/rcaputo/poe.git
.Ve
.SS "SourceForge"
.IX Subsection "SourceForge"
http://sourceforge.net/projects/poe/ is \s-1POE\s0's project page.
.SS "Internet Relay Chat (\s-1IRC\s0)"
.IX Subsection "Internet Relay Chat (IRC)"
irc.perl.org channel #poe is an informal place to waste some time and
maybe even discuss Perl and \s-1POE.\s0 Consider an \s-1SSH\s0 relay if your
workplace frowns on \s-1IRC.\s0 But only if they won't fire you if you're
caught.
.SS "Personal Support"
.IX Subsection "Personal Support"
Unfortunately we don't have resources to provide free one-on-one
personal support anymore. We'll do it for a fee, though. Send Rocco
an e\-mail via his \s-1CPAN\s0 address.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
Broken down by abstraction layer.
.SS "Layer 1"
.IX Subsection "Layer 1"
POE::Kernel, POE::Session, \s-1POE::NFA\s0
.SS "Layer 2"
.IX Subsection "Layer 2"
POE::Wheel, POE::Wheel::Curses, POE::Wheel::FollowTail,
POE::Wheel::ListenAccept, POE::Wheel::ReadLine, POE::Wheel::ReadWrite,
POE::Wheel::Run, POE::Wheel::SocketFactory
.PP
POE::Driver, POE::Driver::SysRW
.PP
POE::Filter, POE::Filter::Block, POE::Filter::Grep,
POE::Filter::HTTPD, POE::Filter::Line, POE::Filter::Map,
POE::Filter::RecordBlock, POE::Filter::Reference,
POE::Filter::Stackable, POE::Filter::Stream
.SS "Layer 3"
.IX Subsection "Layer 3"
POE::Component, POE::Component::Client::TCP,
POE::Component::Server::TCP
.SS "Layer 0"
.IX Subsection "Layer 0"
POE::Loop, POE::Loop::Event, POE::Loop::Gtk, POE::Loop::IO_Poll,
POE::Loop::Select, POE::Loop::Tk
.PP
POE::Queue, POE::Queue::Array
.PP
POE::Resource, POE::Resource::Aliases, POE::Resource::Events,
POE::Resource::Extrefs, POE::Resource::FileHandles,
POE::Resource::SIDs, POE::Resource::Sessions, POE::Resource::Signals
.SS "Helpers"
.IX Subsection "Helpers"
POE::Pipe, POE::Pipe::OneWay, POE::Pipe::TwoWay
.SS "Home Page"
.IX Subsection "Home Page"
http://poe.perl.org/
.SS "Bug Tracker"
.IX Subsection "Bug Tracker"
https://rt.cpan.org/Dist/Display.html?Status=Active&Queue=POE
.SS "Repositories and Changes"
.IX Subsection "Repositories and Changes"
You can browse the \s-1POE\s0 source and complete change logs at
https://github.com/rcaputo/poe. It also provides an \s-1RSS\s0
news feed for those who want to follow development in
near-realtime.
.SS "Other Resources"
.IX Subsection "Other Resources"
https://metacpan.org/module/POE
.PP
http://search.cpan.org/dist/POE
.SH "AUTHORS & COPYRIGHT"
.IX Header "AUTHORS & COPYRIGHT"
\&\s-1POE\s0 is the combined effort of quite a lot of people. This is an
incomplete list of some early contributors. A more complete list can
be found in \s-1POE\s0's change log.
.IP "Ann Barcomb" 2
.IX Item "Ann Barcomb"
Ann Barcomb is <kudra@domaintje.com>, aka \f(CW\*(C`kudra\*(C'\fR. Ann contributed
large portions of POE::Simple and the code that became the ReadWrite
support in POE::Component::Server::TCP. Her ideas also inspired
Client::TCP component, introduced in version 0.1702.
.IP "Artur Bergman" 2
.IX Item "Artur Bergman"
Artur Bergman is <sky@cpan.org>. He contributed many hours' work into
\&\s-1POE\s0 and quite a lot of ideas. Years later, I decide he's right and
actually implement them.
.Sp
Artur is the author of Filter::HTTPD and Filter::Reference, as well as
bits and pieces throughout \s-1POE.\s0 His feedback, testing, design and
inspiration have been instrumental in making \s-1POE\s0 what it is today.
.Sp
Artur is investing his time heavily into perl 5's iThreads and \s-1PONIE\s0
at the moment. This project has far-reaching implications for \s-1POE\s0's
future.
.IP "Jos Boumans" 2
.IX Item "Jos Boumans"
Jos Boumans is <kane@cpan.org>, aka \f(CW\*(C`kane\*(C'\fR. Jos is a major driving
force behind the POE::Simple movement and has helped inspire the
POE::Components for \s-1TCP\s0 clients and servers.
.IP "Matt Cashner" 2
.IX Item "Matt Cashner"
Matt Cashner is <sungo@pobox.com>, aka \f(CW\*(C`sungo\*(C'\fR. Matt is one of \s-1POE\s0's
core developers. He's spearheaded the movement to simplify \s-1POE\s0 for
new users, flattening the learning curve and making the system more
accessible to everyone. He uses the system in mission critical
applications, folding feedback and features back into the distribution
for everyone's enjoyment.
.IP "Andrew Chen" 2
.IX Item "Andrew Chen"
Andrew Chen is <achen\-poe@micropixel.com>. Andrew is the resident
POE/Windows guru. He contributes much needed testing for Solaris on
the \s-1SPARC\s0 and Windows on various Intel platforms.
.IP "Douglas Couch" 2
.IX Item "Douglas Couch"
Douglas Couch is <dscouch@purdue.edu>. Douglas helped port and
maintain \s-1POE\s0 for Windows early on.
.IP "Jeffrey Goff" 2
.IX Item "Jeffrey Goff"
Jeffrey Goff is <jgoff@blackboard.com>. Jeffrey is the author of
several \s-1POE\s0 modules, including a tokenizing filter and a component for
managing user information, PoCo::UserBase. He's also co-author of \*(L"A
Beginner's Introduction to \s-1POE\*(R"\s0 at www.perl.com.
.IP "Philip Gwyn" 2
.IX Item "Philip Gwyn"
Philip Gwyn is <gwynp@artware.qc.ca>. He extended the Wheels I/O
abstraction to support hot-swappable filters, and he eventually
convinced Rocco that unique session and kernel IDs were a good thing.
.Sp
Philip also enhanced POE::Filter::Reference to
support different serialization methods. He has also improved \s-1POE\s0's quality
by finding and fixing several bugs. He provided \s-1POE\s0 a much needed code
review around version 0.06.
.Sp
Lately, Philip tracked down the race condition in signal handling and
fixed it with the signal pipe.
.IP "Arnar M. Hrafnkelsson" 2
.IX Item "Arnar M. Hrafnkelsson"
Arnar is <addi@umich.edu>. Addi tested \s-1POE\s0 and POE::Component::IRC on
Windows, finding bugs and testing fixes. He appears throughout the Changes
file. He has also written \*(L"cpoe\*(R", which is a POE-like library for C.
.IP "Dave Paris" 2
.IX Item "Dave Paris"
Dave Paris is <dparis@w3works.com>. Dave tested and benchmarked \s-1POE\s0
around version 0.05, discovering some subtle (and not so subtle)
timing problems. The pre-forking server sample was his idea.
Versions 0.06 and later scaled to higher loads because of his work.
He has contributed a lot of testing and feedback, much of which is
tagged in the Changes file as a\-mused. The man is scarily good at
testing and troubleshooting.
.IP "Dieter Pearcey" 2
.IX Item "Dieter Pearcey"
Dieter Pearcey is <dieter@bullfrog.perlhacker.org>. He goes by several
Japanese nicknames. Dieter's current area of expertise is in Wheels and
Filters. He greatly improved POE::Wheel::FollowTail, and his Filter
contributions include the basic Block filter, as well as Stackable,
RecordBlock, Grep and Map.
.IP "Plixer International" 2
.IX Item "Plixer International"
Plixer International is at <http://plixer.com/>. Their sponsorship
has helped \s-1POE 1.300\s0 and beyond be significantly more robust using
iThreads, especially when using \fBfork()\fR in Windows.
.IP "Robert Seifer" 2
.IX Item "Robert Seifer"
Robert Seifer is <e\-mail unknown>. He rotates \s-1IRC\s0 nicknames
regularly.
.Sp
Robert contributed entirely too much time, both his own and his
computers, towards the detection and eradication of a memory
corruption bug that \s-1POE\s0 tickled in earlier Perl versions. In the end,
his work produced a simple compile-time hack that worked around a
problem relating to anonymous subs, scope and @{} processing.
.IP "Matt Sergeant" 2
.IX Item "Matt Sergeant"
Matt contributed \f(CW\*(C`POE::Kernel::Poll\*(C'\fR, a more efficient way to watch
multiple files than \fBselect()\fR. It's since been moved to
POE::Loop::IO_Poll.
.IP "Richard Soderberg" 2
.IX Item "Richard Soderberg"
Richard Soderberg is <poe@crystalflame.net>, aka \f(CW\*(C`coral\*(C'\fR. Richard is
a collaborator on several side projects involving \s-1POE.\s0 His work
provides valuable testing and feedback from a user's point of view.
.IP "Dennis Taylor" 2
.IX Item "Dennis Taylor"
Dennis Taylor is <dennis@funkplanet.com>. Dennis has been testing,
debugging and patching bits here and there, such as Filter::Line which
he improved by leaps in 0.1102. He's also the author of
POE::Component::IRC, the widely popular POE-based successor to his
wildly popular Net::IRC library.
.IP "David Davis" 2
.IX Item "David Davis"
David Davis, aka Xantus is <xantus@cpan.org>. David contributed patches
to the \s-1HTTPD\s0 filter, and added \s-1CALLER_STATE\s0 to POE::Session. He is the
author of Sprocket, a networking framework built on \s-1POE.\s0
.IP "Others?" 2
.IX Item "Others?"
Please contact the author if you've been forgotten and would like to
be included here.
.SS "Author"
.IX Subsection "Author"
.IP "Rocco Caputo" 2
.IX Item "Rocco Caputo"
Rocco Caputo is <rcaputo@cpan.org>. \s-1POE\s0 is his brainchild. He wishes
to thank you for your interest, and he has more thanks than he can
count for all the people who have contributed. \s-1POE\s0 would not be
nearly as cool without you.
.Sp
Except where otherwise noted, \s-1POE\s0 is Copyright 1998\-2013 Rocco Caputo.
All rights reserved. \s-1POE\s0 is free software; you may redistribute it
and/or modify it under the same terms as Perl itself.
.PP
Thank you for reading!