<$Id: CHANGES,v 1.90 2002/03/26 00:23:45 rcaputo Exp $

Revision history for POE
========================

Changes marked with "(!!!)" may break backward compatibility.

Version numbers have four fields: X.YYZZAAB

  X  is the interface version, currently 0 as public interfaces gel.
  YY is the major revision number.
  ZZ is the minor revision number.  It's 00 for public CPAN releases,
     or nonzero for beta web site releases.
  AA is a testing revision.  It's usually 00, which means the tarball
     is a public release.  Nonzero versions are limited alpha level
     releases (development snapshots) for specific testers.

,------------------------------------------------------------------------------
| Hey, Rocco, don't forget to assign a tag to the release after you
| make dist on it!  0.0910 is ``v0_0910''!  For example:
|
| cvs tag -Rc v0_11   .
| cvs tag -Rc v0_1009 .
`------------------------------------------------------------------------------

---------------
0.19 2002.03.25
---------------

Rocco fixed where Client::TCP did not always call its Disconnected
callback when the client requested a disconnect.

Rocco revised the order of operations in Wheel::Curses'
initialization, but it didn't fix the bug he was looking for.

Rocco made missing termcap warnings less ugly in t/00_coverage.t.

Rocco rewrote POE::Kernel's internal data structure documentation.

Sungo found a buglet (because it was harmless... this time) in
POE::Kernel's dispatch function.  It was breaking Session
encapsulation because of a typo.  Rocco applied the fix.

Bline found out that POE::NFA's goto_state() was not going to the very
first state before his session was needed by other startup sessions.
Rocco made goto_state() be synchronous the first time, so that the
equivalent of a synchronous _start would happen.

Rocco updated POE::NFA to use CALLER_FILE_NAME and CALLER_FILE_LINE so
that ARG0 is in the same offset as the other sessions.

Rocco added a get_runstate() method to POE::NFA.  This is equivalent
to get_heap() in POE::Session.

Rocco patched Wheel::ReadLine to use a private copy of STDIN and
STDOUT so that other code could redirect them.

Rocco wrapped binmode() in eval{} in Kernel and SocketFactory.  It
turns out that binmode() is not so harmless if it's used with a tied
filehandle class that doesn't support it.

Rocco wrapped Kernel's fcntl() calls in a test for tied() since fcntl
on tied filehandles isn't meaningful.

TonyC spent considerable time beating on Win32 support and found a
workable work-around to tests 4 and 10 failing.  Rocco applied some
patches.

Curses doesn't always update the screen properly if STDIN is not in
blocking mode.  Rocco patched POE::Wheel::Curses to ensure STDIN
blocks.

Rocco updated the Windows and MacOS support info. in POE's man page
based on user feedback.

Rocco found and fixed a circular reference in POE::Wheel::ReadLine
that prevented it (and thus programs) from exiting cleanly.

Add blib and blib/lib to lib/deptest.perl, making it more useful for
other modules.

---------------
0.18 2002.01.20
---------------

Sungo added CALLER_FILE and CALLER_LINE to the argument list for state
calls.

Freeside suggested that POE::Kernel's break-even point between linear
and binary searching be raised to 512 or 1024.  After some
benchmarking, Rocco raised it to 512.

Rocco fixed the return value for POE::Kernel's alarm_remove_all()
call, while researching its behavior for poed.

Rocco added sungo's $VERSION code to each file.  Now all the
sub-modules will appear with versions in various indexes.

Ignatz and Zenham reported a nasty looking message when testing POE
without Curses.  It's technically a "skip" message, but it includes an
error message (trapped with eval) and so looks like an error.  Rocco
made this class of skip message much friendlier.

Rocco applied Jason May's patch to fix TRACE_RETURNS (they had a space
instead of an underscore) in POE::Kernel.  Why didn't strict catch
that?

Rocco added a little more alarms documentation.  Jason May reported
that it wasn't clear where alarms were set and how they would be
removed.

Rocco fixed a misattribution in the CHANGES file.  Sorry, Jonathan.

Rocco added a meta() call to POE::Wheel::Curses so international
characters may also be entered.

Rocco added a note to POE.pm's POD that the cookbook is slowly taking
over for the samples.

-----------------------
0.1702 2002.01.03 (!!!)
-----------------------

Happy Gregorian new year!

Gabriel Kihlman found a memory leak while running thrash.perl.  It
turned out to be an ID leak in POE::Wheel.  free_wheel_id() was not
properly deleting destroyed wheel IDs.  Rocco fixed it.

Rocco removed a silly reference from Wheel::ReadWrite while he was
tracking down Gabriel Kihlman's memory leak.

Rocco added a constant to thrash.perl while tracking down Gabriel
Kihlman's memory leak.  The number of simultaneous clients can be
controlled cleaner.

Rocco added filehandle leak detection to thrash.perl while tracking
down Gabriel Kihlman's memory leak.

Rocco added dummy event handlers for various sessions in thrash.perl.
This cleaned up the warnings when ASSERT_DEFAULT was turned on while
tracking down Gabriel Kihlman's memory leak.

Luis Henrique Fagundes found a typo in samples/tutorial-chat.perl.
Rocco corrected it.

Rocco refactored POE::Kernel's filehandle watcher data structures and
the related code that maintains them.  It's still raw code; there's
plenty of room for cleanup, but it passes POE's test suite.  This
touches POE::Kernel.pm, and POE::Kernel::*.pm, but no public
interfaces have changed.

(!!!) Rocco made select (filehandle watcher) events post through the
queue instead of calling their handlers immediately.  Watchers are
paused until their queued events are dispatched, preventing redundant
events from clogging up the queue.  This change is not really expected
to break anything, but it does change the way POE's public interface
works.

Rocco added code to _internal_select() that removes any events from a
filehandle whatcher when the watcher is being removed.  This fixes the
last little problem with enqueued events, and new style watchers
should behave just like the old ones.  Filehandle watchers, not, you
know, the Old Ones.

Rocco added the newer wheels to t/00_coverage.t.

Rocco updated POE::Kernel's and POE::Session's documentation to remove
mentions of "synchronous" or "immediate" filehandle watcher events.

Rocco finally added pause_input() and resume_input() to
POE::Wheel::ReadWrite.  Torvald Riegel will either be incredibly
relieved or intensely dismayed at this and the other input changes in
this version.

Ben Laurie reported that Tk programs don't stop when they die.  Rocco
added a Tk::Error handler that explains the error and emits
SIGUIDESTROY (fictitious) when an error is caught.  Programs should
stop now, although it may not be proper behavior in all circumstances.

Ben Laurie reported that POE's child process reaper is slow.  Rocco
added TRACE_SIGNALS to enable a STDERR log of signal polling activity.

Ben Laurie reported that POE's child process reaper is slow because of
queue latency between reap checks.  He provided a patch placing
waitpid(2) in a loop so the CHLD signals queued up will be reaped at
once.  Rocco applied it.  Ben's report:

  I found that the enclosed patch solves the problem - it seems it
  simply doesn't poll often enough. Note that with this patch it picks
  up 3-10 children on _each_ poll! Also note that the machine is 100%
  loaded for most of the time my stuff is running, with a load average
  of 8 or so (I actually run up to 30 subprocesses in parallel in this
  test).
 
  Without the patch after the first few polls it always polls
  "immediately" for the whole of the rest of the run - its just that
  "immediately" tends not to be very immediate (.5-1 second), hence
  the problem.

Rocco applied freeside's samples/proxy.perl patch to allow hyphens in
hostnames.

Rocco made Driver::SysRW the default driver for Wheel::FollowTail and
Wheel::ReadWrite.

Rocco made Filter::Line the default filter for Wheel::FollowTail and
Wheel::ReadWrite.

Rocco added code to t/06_tk.t to test Wheel::ReadWrite with either a
default driver or a default filter.

Rocco added code to t/07_event.t to test Wheel::ReadWrite with a
default driver and filter together.

Rocco fixed t/08_errors.t to skip Filter::HTTPD tests if the filter's
prerequisites are missing.

Fletch reported that t/19_filterchange.t was failing if Storable and
FreezeThaw weren't installed.  Rocco added a couple missing
MyOtherFreezer references.

Rocco added code to Filter::HTTPD's "Did not want any more data"
error.  Now it dumps the data it didn't want.

Ann Barcomb wrote SimpleSocket, a high-level wrapper for SocketFactory
and ReadWrite as a combined server.  She donated her work to POE's
Server::TCP component, but the callback schemes turned out to be
incompatible.  Rocco extended POE::Component::Server::TCP with her
ideas, but he could not make it work the way she envisioned.

Rocco also wrote POE::Component::Client::TCP based on Ann's ideas from
SimpleSocket.  It too is more POE than Simple.

Rocco wrote t/26_comp_tcp.t to test the Server and Client TCP
components.

Miroslav Madzarevic found a race condition in samples/proxy.perl where
proxy sessions would not shut down properly on an error.  Rocco
applied his fix.

Sungo needed signals with extra parameters.  Rocco patched
POE::Kernel's signal() method to pass them on.

Sungo reported that POE::Preprocessor causes perl to spew a slew of
unhelpful errors on an undefined macro warning.  He suggested removing
the macro definition and making the warning more robust.  Rocco
decided that removing the macro would cause other unrelated errors, so
he patched Preprocessor to die instead.

Rocco credited more people in POE.pm.

SciFi is trying to install POE on Windows.  A new POSIX constant
doesn't exist: EADDRNOTAVAIL.  Rocco defined it in the modules that
use it.

Jason Boxman discovered that Filter::HTTPD blindly prepends "HTTP/1.0"
to response headers.  Rocco fixed it so the protocol defaults to
HTTP/1.0, and prepending it isn't necessary anymore.

Jason Boxman also found out that Filter::HTTPD does not play nicely
with the latest LWP.  It turned out that URI::URL is deprecated.
Rocco fixed Filter::HTTPD to use URI directly instead.

Rocco updated t/08_errors.t so it doesn't crash on Windows.  Thanks to
Jonathan Steinert for loaning a shell on a Windows 2000 machine to
test POE.

Rocco discovered the true cause of the signal() redefine warning in
POE::Kernel (POSIX signal_h imports) and fixed it.

Test 14 was blowing up on Windows because select() was being called
without file descriptor bits.  Rocco fixed it.

Morbus Iff is testing POE on MacPerl.  It never got past Makefile.PL,
though.  Chris Nandor pointed out that "exit 0" at the end is stopping
his installer's "do Makefile.PL".  Rocco applied his "unless $^O eq
'MacOS'" suggestion to Makefile.PL.

Jason Boxman is using Driver::SysRW directly, and it's not documented
very well.  Patch Driver.pm to discuss flush()'s method of returning
errors.

Apply various fixes to Wheel::Run to make it work better on Windows.

Freeside discovered a nasty bug where sessions wouldn't always
self-destruct, especially when using closures to push postbacks into a
session's event handlers.  The fix was to add a very small garbage
collection check in POE::Kernel's event dispatcher.

Dynweb noticed that Win32 machines return negative PIDs and the sanity
check in POE::Kernel was failing because it expected positive PIDs.
Rocco fixed the check to expect negtavie PIDs on Win32 systems.

Added warnings when trying to use _xyz (underscore-led) event names
from userland code.  Some people may think posting _stop will stop a
session, but it doesn't.  These warnings are only enabled when
ASSERT_USAGE is set.

Rocco set slave ptys' window sizes to match STDIN's, in Wheel::Run.
ssh was propagating a null window size to Solaris, which was being
rather strict about it.

Rocco added precision to TRACE_SELECT and TRACE_EVENTS times so all
the significant digits for millisecond times would show.

Rocco added more output for TRACE_SIGNALS.  Linux users are reporting
hangs in select() when their programs catch signals.

Rocco increased Client::TCP and Server::TCP's read/write block size to
4KB.

Rocco fixed a stupid closure trick in Server::TCP that made every
client session use the same filter instance.  Thanks to freeside for
finding this one and providing a beautiful test case.

(!!!) Rocco removed the experimental synchronous stuff from POE::NFA.
There is a slight chance that this may break backward compatibility in
programs that use POE::NFA.

-----------------------
0.1701 2001.10.22 (!!!)
-----------------------

I'm tempted to nickname this release "Enterprise", but I'm not gonna.

Rocco applied Tony Cook's documentation patch.

Sungo applied his Preprocessor.pm patch that lets packages inherit
macros and constants from other packages.  It's another step towards
making Session inheritable.

Rocco applied Sky's patch to prevent Filter::HTTPD from mangling
newlines in responses' content.  Sky's patch also documents how to
stream large files.

Rocco applied a patch to Component::Server::TCP so it doesn't generate
missing-state warnings.

Rocco applied an experimental patch to Kernel's SIGCHLD code.  It
slowly polls for child processes to reap (once a second) until some
CHLD signal arrives.  After that, it polls rapidly until no more are
available.  Then it goes back into once per second mode.

Ingy noticed that the deprecation warnings for using coderefs as event
names in SocketFactory were really confusing.  These have been
changed, hopefully for the better.

(!!!) Recombined the event and alarm queues.  This is a big internal
change to POE::Kernel and POE::Kernel::*, but it doesn't affect public
interfaces.  It's marked as potential breakage for people who are
working in POE's guts.

(!!!) Clean up POE::Kernel and POE::Kernel::* names.  Replace "state
transition event" with "event".  Replace "state" with "event" when it
refers to events.  Replace "state" with "event handler" when it refers
to code invoked to handle events.  Fix up the documentation a little,
too.  This could potentially break programs that rely on undocumented
POE::Kernel internals.

Received reports that Linux's select() will block indefinitely if it's
somehow interrupted with a signal when called with a 0s timeout.  It's
been implicated with the sudden lockup of long-running processes.
Worked around it by setting the minimum select() timeout to 1
microsecond on Linux.

Add defined tests to Wheel::Run so that it doesn't generate errors on
Ctrl-C.

Add code to POE::Wheel::FollowTail so it can emit a ResetEvent when
files it watch have been reset.

Fixed a bug in _alarm_find per Kirill's recommendation.  It would die
with "internal inconsistency: alarm should have been found" on long
alarm queues.

Fixed a bug that Kirill spotted in POE::Kernel::Select's macro
substrate_ignore_filehandle.  It assumed /$/ was really the end of a
string, but /$/ can match before a newline.  As a result, select(2)
vectors were getting mangled, causing mysterious "select error: Bad
file descriptor" or "select error: Unknown error" messages.

(!!!) Posted events now keep sessions alive.  This simplifies
inter-session communication greatly, eliminating the need to call()
between sessions.  Chances are that this won't break many (any?)
programs, but it's flagged as such to catch your attention.

Debug FollowTail code per freeside's test case.

Fixed a leak in Kernel/Tk.pm.  Circular references on filehandles (in
Tk?) were preventing them from closing.  Stringifying a handle in a
strategic place (it was being used as a hash key anyway) broke the
reference loop and let handles close properly.

Dieter Pearcey told me to remove an apostrophe from a comment, so I
did.

---------------
0.17 2001.08.29
---------------

This is the second release today.  It fixes a test failure on Linux.

Brian Knox discovered (the hard way) that POE::Wheel::Run wasn't
flushing STDOUT and STDERR when executing coderefs.  Added auto-flush
to those handles and explicit close() calls after the coderef was run.

Added coral's idea and algorithm for timesliced code to TODO.

Fixed POE::Pipe's custom socketpair on Linux.  Calling getpeername on
a connecting socket returns a value that does not equal accept's
return value, despite both ends of the socket being on the same
machine, in the same program.

Added dynweb's Solaris test results for 0.16.  Added my own test
results for 0.17 on FreeBSD and Linux.

---------------
0.16 2001.08.29
---------------

Dan McCormick spotted a (pretty big) problem in the way Gtk alarms
were dispatched.  It turned out that the next-alarm timeout was not
being refreshed for the second or subequent alarm set.  That doesn't
matter if alarms are always set later than previous ones, but it
failed when he tried to set an alarm before the first one in the
queue.  Fixed!  And fixed for Tk and Event, too.  Select didn't have a
problem.

Added a GOTCHAS / FAQ section to POE::Wheel::ReadLine's manpage.  This
seems like a good idea, so maybe I'll add one to other pages as
questions come up.

Commented out the "posthumous re-entry" check in POE::Kernel's run
method.  I don't remember why this was added; maybe some event loops
don't like it.

Many many TODO additions and updates.

Everything in 0.1501 and 0.1502.

-----------------------
0.1502 2001.08.12 (!!!)
-----------------------

Updated README to include dynweb's test results for Solaris 8.

(!!!) Fixed Filter::HTTPD so it doesn't crash at runtime when a
malformed HTTP request arrives.  This required altering the filter's
return values slightly!  The filter may return an HTTP::Response
object if there has been an error parsing the request.  Please see the
updated documentation for a suggestion on how to handle the new
behavior.  Thanks to undercut for spotting this problem.

Updated samples/httpd.perl to properly deal with Filter::HTTPD
returning HTTP::Response objects.

lib/deptest.perl was failing on Windows because File::Spec->catdir()
properly uses backslashes ("\") as path separators on DOSISH systems,
but %INC uses forward slashes ("/").  The module was used okay, but it
was never found in %INC.  Now deptest.perl tries both, damnit.

Fixed Filter::HTTPD to not print diagnostics and not die with an error
on malformed requests.  Rather, it generates an HTTP::Response object
when bad requests arrive.  These and more Filter::HTTPD patches are
courtesy of Anton Berezin.

Anton Berezin posted several more Filter::HTTPD cleanup patches.  He
changed the magic numbers for HTTP errors into their corresponding
constants.  He Made it illegal for HEAD requests to contain content.
Finally he made POST requests' content length checking stricter yet
less likely to cause programs to warn or die.

Make turning off blocking in POE::Kernel more robust.  Retry on EAGAIN
or EWOULDBLOCK.

Implement a replacement for socketpair() in POE::Pipe, and have
POE::Pipe::OneWay and ::TwoWay use that on systems where pipe() and
socketpair() aren't supported.  If we're lucky, the tests which used
to hang on Windows won't anymore.  They may crash outright, though,
but that's a different issue altogether. :)

Add POE::Pipe to the MANIFEST.

Tweak the TRACE_PROFILE output at the end of a program's run.  It
should not have been adding an "s" to each event name.

Skipped the protocol-with-UNIX-sockets test in t/08_errors.t on
Windows systems.  Windows don't do UNIX sockets.  Also broke the
relationship between two tests so that one's failure does not
necessarily cascade into the other's.

Commented upon some of the odd data-driven features in
SocketFactory.pm.

Test 22 (Wheel::Run) may have been failing because the command line to
run child processes include single quotes.  Windows shells usually use
double quotes around arguments containing spaces.  Bleah!

Added Philip Gwyn's debugging information patches to POE::Pipe::*Way.
Perhaps this will speed up finding problems on Windows.

Added a kill() method to Wheel::Run, so that child processes may be
forcibly toasted if necessary.

Replaced *STDIN with \*STDIN in Wheel::ReadLine and Wheel::Curses,
fixing those modules with Event (and possibly other event systems).
Thanks to Fletch for spotting the problem.

Documented addhistory() in POE::Wheel::ReadLine.

Added a clear() method so POE::Wheel::ReadLine can be used to clear
the terminal.

Documented several ideas, contributed or otherwise, in the TODO.

s/depreciat/deprecat/g; Thanks to fimmtiu for pointing out this long
standing error.

Added streaming filter change tests to t/19_filterchange.t.  Fixed
set_filter and set_input_filter in Wheel::ReadWrite so this works.
Finally!

-----------------
0.1501 2001.07.27
-----------------

POE::Filter::HTTPD would corrupt long requests (ones which need to be
read by more than one get() call).  Anton Berezin spotted the problem
and patched it.

Added POE::Session::ASSERT_DEFAULT (see POE::Kernel::ASSERT_DEFAULT
for an explanation), and POE::Session::ASSERT_STATES.  The STATES
assertion turns on "debug" options for POE::Session instances by
default.  With one assertion, misspelled state names are caught in an
entire program.  ASSERT_STATES isn't necessary for POE::NFA because
that variation of POE::Session dies on bad events.

Fixed Solaris 8 test results in README.  Thanks, dynweb!

Documented in TODO: An alternative design for signal propagation and
handling.

Documented in TODO: An alternative to yield().

Fixed ARG0..ARG9 offsets so they match in POE::Session and POE::NFA,
which they must do or bad things happen.

Removed an extra _stop in samples/preforkedserver.perl.

The following Windows fixes are in response to some fine testing by
Philip Gwyn and Mike Wilkinson.

Wrap Wheel::Run's getpriority() and setpriority() calls in eval, and
check their return values.  Hopefully Wheel::Run won't die terribly on
systems that don't support these calls.

Update the README with more detailed Windows testing information.

Change Pipe::(One|Two)Way to always use IO::Socket::INET on Windows
systems.  I suspect socketpair() is succeeding under Windows but
creating "sockets" which select() doesn't recognize as sockets.

Fix t/01_sessions.t to skip its signals tests on Windows.  Windows'
signals support is, erm, lacking at this time.

Add Windows compatibility constants to the symbols which need to be
cleaned out from POE::Kernel's namespace in t/08_errors.t.

Make runtime errors in macros point to the absolute line in the file
where the macro was defined, rather than the offset into the macro
itself.  Developers can jump directly to the offending code in the
file rather than count lines in the macro.

Turn const and enum constants in POE::Session and POE::NFA back into
constant subs.  This is a step towards inheritable sessions, now that
@ISA and method calls aren't real slow anymore.  There may still be a
performance hit in legacy versions of Perl, but the code will still
work there.

Turn DEB_DESTROY into TRACE_DESTROY in POE::Session and POE::NFA, so
it's more like all the rest.  I didn't actually document it,
though. :)

Tweak lib/deptest.perl to print a more useful diagnostic message for
not finding a module in %INC although it loaded okay.

Fix test 18's skips for unsupported compiled regexps in older perl
versions (namely 5.004_05).

Add get_one_start() and get_one() to the following filters: Block,
Grep, Line, Map, RecordBlock, Reference, and Stream.  Switching
between these filters should be robust now.

Add support for get_one_start() and get_one() to Wheel::ReadWrite.  It
only uses these methods if the input wheel supports them.  Otherwise
it falls back to the older, faster, but more dangerous get().

Tweak language for existing deprecations in TODO, so the schedule of
changes is more explicit.  Please don't misunderstand.

Develop the ideas for fixing filter changing in TODO.  Set up a
checklist, and actually begin implementing stuff.

Tested error conditions in several modules, prompting some changes.

Made the errors for Session->new() parameters a little more
descriptive.

Made misuse of Filter::HTTPD->get_pending() croak instead of warn.

Made bad constructor parameters in POE::Wheel::Run fatal.

Added a test for Component::Server::TCP's "shutdown" event handler.

Added get_one_start() and get_one() tests for Filter::Block.

Added get_one_start() and get_pending() tests for Filter::Reference.

Added get_one_start(), get_one(), and get_pending() tests for
Filter::Map and Filter::Grep.

Added tests for Filter::Stackable's filter stack management methods.

---------------
0.15 2001.07.15
---------------

Added Philip Gwyn's patch to allow Filter::Reference to use data
marshallers with :: in their package names.

(!!!) This is a CPAN release.  Everything since 0.14 is also new to
people tracking POE on the CPAN.  See versions 0.1401 through 0.1404
for fun things, including some breakage.

Tweaked the TODO file, at least the part that everyone should read, so
it's friendlier or the mind.  I hope.

-----------------
0.1404 2001.06.02
-----------------

Kirill found a bug in alarm_adjust(): it would corrupt/disorder the
alarm queue.  Added ASSERT_ALARMS to POE::Kernel::Select, ensuring
that the alarm queue stays in order-- or ELSE!

Added tests to t/02_alarms.t, tweaking the disordered alarm queue bug
in alarm_adjust().

Fixed alarm_adjust().  Optimized a little in _enqueue_alarm() while I
was there.

Coral spotted me using "either" to refer to three things in the
POE::Kernel manpage.  Corrected that bit of bad grammar.  If anyone
else wants to pick over the rest of the documentation for errors,
they'd better submit patches too.

I had no idea the files in the ./lib directory were being installed.
They were never meant to be, but MakeMaker was including that
directory by default.  Fletch pointed me to PMLIBDIRS, which I have
tweaked to prevent this from happening in the future.

Philip Gwyn found and patched a bug where setting (trace => 0) on a
session turned tracing on.  I fixed the same bug for (debug => 0), and
I fixed both options in NFA.pm also.

Philip Gwyn found a documentation bug in POE::Session, claiming that
STATE wasn't _default in _default handlers.  Fixed.

Matt Cashner pointed out extraneous noise in t/00_coverage.t, which
was subsequently squelched.

-----------------
0.1403 2001.06.07
-----------------

Added POE::Kernel method alias_list() to return the alias(es)
associated with a particular session.

Documented alias_list(), and added tests to t/03_aliases.t

Changed case of Changes in NEEDS.

Added TODO to NEEDS.

Applied Philip Gwyn's patches to remove zero-width negative
look-behind assertions from lib/deptest.perl.  They were preventing
the dependency checker from running under 5.004_05.

Applied Philip Gwyn's patch to prevent t/18_filter_line.t from dying
outright when compiled regexps aren't available.  D'oh!

POE::Wheel::ReadLine also used a zero-width negative look-behind
assertion for an elegant single regexp that transposes words.  The
code that replaces it is 36 lines long, but it works with 5.004_05.

-----------------
0.1402 2001.06.03
-----------------

Have the child process in Wheel::Run attempt to kill itself if
POSIX::_exit() isn't available.

Document a lot of requests and things in TODO.

Add alarm_set, alarm_adjust, alarm_remove, and alarm_remove_all to
POE::Kernel.  Add tests for these things in t/02_alarms.t.  Document
them in POE::Kernel's manpage.

Deprecate POE::Kernel's queue_peek_alarms() method.  The new alarm
functions let programmers add, remove, and track alarms by ID, so
looking into the alarm queue is no longer necessary.  The complete
deprecation schedule is in TODO.

Add POE::Kernel leak detection for alarm IDs.  Discovered a memory
leak in alarm IDs, and removed it.

Add POE::Kernel leak detection for signals, completing the suite of
global structure leak detectors.  Discovered and fixed a potential
memory leak in signals data structures.

-----------------------
0.1401 2001.05.28 (!!!)
-----------------------

(!!!) Tk postbacks must return 0.  Gtk postbacks must return 1.
Actually, Gtk postbacks might return 0, too.  The test relies on 0,
anyway, but mandrake says he needs postbacks to return 1.  I'm so
confused!  Leave Gtk's postback return value 0 for now, but it might
change later.

(!!!) Deprecation schedules and other notices have been moved to a
TODO file.  Please consult that file or be surprised later.

(!!!) Changes has been renamed to CHANGES to follow suit with MANIFEST
and README.

(!!!) Breakage warning!  XyzState parameters in wheels have been
renamed to XyzEvent and documented as such.  They are guaranteed to
work without warnings until ????.??.??.

Fix t/06_tk.t to skip if Tk is outdated, rather than fail.

Fix lib/deptest.perl to recognize Exporter on Solaris.

Increase dependency checking information on Solaris in case attempts
to fix the Exporter bug aren't successful.

Add XyzEvent support to wheels.  Code to support XyzEvent and XyzState
is marked with the comment C<# STATE-EVENT>.  Hooks for deprecation
warnings are also commented.  Changed the documentation to say
XyvEvent instead of XyzState, so new users will not learn the
deprecated ways.

Verified that the deprecation from State to Event does not break
existing tests.

Ported the existing tests to use XyzEvent instead of XyzState, and
verified that they still pass.

Added instructions for installing the ActiveState PPM to README.

Ported the samples from XyzState to XyzEvent, but they still are not
properly tested.

Add POE::Kernel methods detach_myself() and detach_child() to detach
the current session from its parent, or a child session from the
current one.  This breaks the existing parent/child relationship,
allowing parent sessions to be garbage collected if they're no longer
needed.  It resembles the fork/exec trick in Unix.

Added test t/25_detach.t to test detaching sessions.

Fixed a typo in POE::Kernel; the bareword "hostname" should be
$hostname, what with all the work Kernel does to set it properly.
Ray Brinzer's (SF: petruchio) keen eye spotted this one.

Win32's four-argument select() call fails when there are no
filehandles.  In this case, call sleep() instead.  Have Time::HiRes
import its own sleep() if it's available, so that subsecond sleeps
will work.

---------------
0.14 2001.04.23
---------------

Fix POE::Kernel::Tk.pm so that it doesn't kill CPAN.pm's "r" command.

Fix lib/deptest.perl: out of date dependencies were not correctly
reported on, and dependency version checking was broken.

---------------
0.13 2001.04.20
---------------

Add Dieter Pearcey's Stackable filter, allowing ReadWrite (and other
wheels) to pass data through two or more filters.  Stackable comes
with other helpful filters: Map and Grep to transform data while it's
still in a filter stack, and RecordBlock to group several records into
a block of them.

Add t/24_filter_stack.t as a start for testing stackable filters.
This so far is the only sample code for using these filters, and it's
not very friendly in that regard.

Add ASSERT_USAGE.  Setting this POE::Kernel debugging constant causes
it to check the values passed to its parameters and croak if they're
bad.

(!!!) David Huggins-Daines discovered that POE versions 0.1205 and
later don't work with older Tk versions.  Make the Tk substrate fail
if it's working with an older Perl-Tk library.

(!!!) Gtk+ does not require a top-level window in order for POE to use
its event loop.  Furthermore, Mandrake says it's common for Gtk+
programs not to have any given "main" window which closes a program
when it's destroyed.  POE::Kernel no longer creates a top-level window
when using Gtk+, and it has a new method, signal_ui_destroy, which can
be used to fire UIDESTROY when some arbitrary widget is destroyed.
See the POE::Kernel documentation.

Tk requires at least one widget to use the event loop, so POE::Kernel
continues to create one and set $poe_main_window when Tk is in effect.

(!!!) Deprecate support for coderefs in SocketFactory's SuccessState
and FailureState parameters.

Applied Peter Scott's code/doc/test patches to allow Wheel::Run to
fork off coderefs instead of new programs.

David Huggins-Daines pointed out that Sys::Hostname, while it's
improved in 5.6.0, is pretty poor in prior perls.  Added a manual
POSIX::uname check in POE::Kernel.

Peter Scott pointed out that Wheel::Run won't flush output to a child
process' STDIN unless a StdinEvent parameter is included.  Changed
Wheel::Run to flush to the child's STDIN handle even without
StdinEvent.

Added an Alias parameter to POE::Component::Server::TCP so that it can
receive events from other sessions.

Added a 'shutdown' event handler to POE::Component::Server::TCP.
Combined with the component's alias, this lets some other session shut
down a server.

Began using SourceForge's compile farm for cross-platform testing.
The time reduction in POE's signal tests was too aggressive, causing
some problems on the Debian test system.  Increased the delay a little
bit.

Add POE::Wheel::Curses to provide non-blocking input for Curses
programs.

-----------------
0.1206 2001.03.23
-----------------

Enhance POE::Preprocessor to track macros and constants per package.
Now multiple files sharing the same package also share the same macros
and constants.

Split event substrates into other modules.  It seems like the right
thing to do at the moment.

Karsten Sperling found that POSIX::uname wasn't supported back on
5.005_02 for Win32, but Sys::Hostname is.  Applied Karsten's patch to
use Sys::Hostname, which uses POSIX::uname internally wherever
possible, instead.

Replaced many enum/const statements with constant subs.  Fewer of
these mean less regexps to run against the source code, so startup
should be a little peppier.

Made more Kernel data structures package lexicals.  Runtime should be
slightly quicker.

Remove Exporter use from Kernel and Session, although other modules
like Carp already use it, so it gets loaded no matter what.  I'm about
tapped for startup-optimizing ideas that don't involve rewriting
POE::Preprocessor.

Removed the object layer; files are being restructured as a separate
component.  This is ahead of schedule.

Added POE::Wheel::ReadLine.  This is a Term::ReadLine subset that
cooperates with POE.  Now how do I test it non-interactively?

Remove documentation in POE::Filter::Line and ::Block saying their
put() methods can be used with single logical records.  They can't.

POE::Preprocessor would make regular expressions like /(|a|b)/ when a
sub-expression was optional.  Tweaked it to generate /(a|b)?/ instead.

Rearranged the README sections in an effort to make it more readable.

Fix samples/tk.perl to use C<$poe_main_window> instead of the older
C<$poe_tk_main_window>.  I'm surprised this was overlooked so long.

Eliminated spurous CHLD signals generated by Sys::Hostname.

Some tests have built-in delays.  Reduce the amount of time they take
to run on fast systems.

Stop pausing alarm watchers unnecessarily.

-----------------
0.1205 2001.02.12
-----------------

Added TRACE_RESULTS to lib/TestSetup.  One of the tests in 0.1204 hung
on a user's machine, and it was impossible to figure it out remotely
without first seeing which test hung.

Solaris wasn't setting termios parameters without TCSANOW.  Wheel::Run
wouldn't work in pty mode because the terminal parameters weren't
being set.

Make Wheel::Run's pty conduits run in "raw" or cbreak mode.

Rob Bloodgood found some POD breakage; C<=item>s without blank lines
between them, and things like that.  Patch applied, and I went through
everything and cleaned up some trailing whitespace (none of it
significant) just for kicks.

Newton Brown found a bug in POE's Tk support, which turns out to be a
known issue with Tk's fileevent mechanism.  Thanks to "good_call" via
usenet news for pointing me at
<http://www.xray.mpe.mpg.de/mailing-lists/ptk/2000-12/msg00060.html>,
which explains fileevent's pitfalls and provides their work-arounds.

Oh.  I added a test to t/06_tk.t to exercise the fileevent bug.

Added Tk workarounds to make the new failing tests pass.  Hooray!

Added file/line reporting in Session's trace option, so the sources of
events are now reported.

Apply a bunch of notes Rob Bloodgood sent in about the postback
documentation in POE::Session.

Added ReadWrite methods: get_input_filter and get_output_filter, so
that filters' methods can be manipulated directly.

-----------------
0.1204 2001.01.13
-----------------

Fletch pointed out that SunOS has a psrinfo command to describe a
Sparc's processors.  Excellent!  Updated the README.

Added IO::Pty support to Wheel::Run.  Skip the Pty tests if IO::Pty
isn't available, so's not to break testing for people without it.

Torvald Riegel pointed out that POE::NFA's goto_state() method
required an entry event.  The documentation says it's not mandatory,
so I added his patch to make it optional.

Added a STATE parameter to POE::NFA event handlers.  STATE contains
the name of the machine's current state.

Added a get_current_state() method to POE::NFA.  It returns the
machine's current state's name.

Added t/23_nfa.t to exercise bits of POE::NFA.

Added code to prevent session IDs from colliding after integer
increment wraps.

Devolped a deprecation schedule for some iffy current features and to
make the names of things more consistent.

Added TRACE_RETURNS and ASSERT_RETURNS to generate warnings and/or
hard errors whenever a Kernel function will return an error.

Updated POE::Session's postback() documentation based on user
feedback.  Thanks again to Rob Bloodgood.

Rob Bloodgood sent in a patch for POE::Component::Server::TCP to let
it bind to specific interface addresses.  The default behavior is the
same as before: bind to INADDR_ANY.

-----------------
0.1203 2000.12.29
-----------------

Very minor optimization to Gtk read/write resuming.  Replace Gtk's
noisy warning about resuming unpaused handles with quiet acceptance.

Added POE::Pipe::OneWay, a portable way to create one-way pipes.  It
tries pipe first, then unix domain socketpair, then inet sockets
before failing.

Added POE::Pipe::TwoWay, a portable way to create two-way pipes.  It
tries unix socketpair first, two pipes, then inet sockets before
failing.  It can be more frugal with filehandles than two one-way
pipes.

Added Wheel::Run, an open2/open3 style wheel that lets sessions spawn
off background processes.  It takes care of the whole pipe, fork, exec
deal.

Removed lib/TestPipe and replaced all its uses with either
Pipe::OneWay or Pipe::TwoWay.

Added &many_ok to TestSetup so that lots of tests can be marked ok at
once.  More importantly, lots of them can be marked as skipped in one
swell foop.

Added t/22_wheel_run.t to test uni- and bidirectional pipes, plus the
Wheel::Run wheel which uses them.

-------------
Older Changes
-------------

This file is limited to the last year of changes.  A complete change
history is available at <http://poe.perl.org/?POE_CHANGES>.

----------------
0.01  1998.08.15
----------------

Initial release.  Implemented Kernel, Session, Wheel, Driver, Filter.

---------------------------
EOF: Thank you for reading.
---------------------------
