Revision history for IO-Async

0.803   2024-01-29
        [CHANGES]
         * Module style updates:
            + Use perl v5.14 for `//` operator and `package NAME VER` syntax
            + Updated Pod style
            + Swapped unit tests from `Test::More` to `Test2::V0`
            + Removed several now-unnecessary test-time dependencies

        [BUGFIXES]
         * Take the first name for each aliased signal in case of aliased
           names (RT145759)

0.802   2022-08-15
        [CHANGES]
         * Preƫmptively use Future ->udata API from upcoming release, to
           avoid depending on it being a hashref
         * Report correct caller file + line number in nested test calls to
           wait_for {}

        [BUGFIXES]
         * Use 'SOCK_STREAM' instead of hardcoded 1 in t/50resolver.t
         * Skip exceptional socket condition test on cygwin because it seems
           always to fail there
         * Avoid harmless warnings about undef at global destruction
           (RT142754)

0.801   2021-12-15
        [BUGFIXES]
         * Remove extraneous test-time use of Data::Dump (RT140143)

0.800   2021-11-11
        [CHANGES]
         * Bumped up to three-digit minor version number
         * Added IO::Async::OS->signum2name
         * Implement Future::IO->waitpid API
         * Skip the `spawn` Routine model if POSIX fork() is not available
         * Replace getaddrinfo / getnameinfo with virtual mocking functions
           for unit-testing the resolve, so as not to rely on local platform
           resolver behaviours

0.79    2021-08-06
        [CHANGES]
         * Permit IO::Async::Routine or Function by module+func names instead
           of CODE reference
         * Added new Routine/Function model of `spawn`
         * Implement IO::Async::Resolver by module+func rather than code

        [BUGFIXES]
         * Require Socket 2.029 on MSWin32 because of AF_UNIX fix (RT133018)

0.78    2021-01-21
        [CHANGES]
         * Warn on attempts to ->connect to INADDR(6)_LOOPBACK as some OSes
           (e.g. OpenBSD) do not allow it
         * Various fixes for IO::Async::LoopTests to better support
           IO::Async::Loop::UV:
            + Insert some ->loop_once(0) calls between timing tests to allow
              libuv to clear its pending queues
            + Allow loops to declare that they cannot perform all-child PID
              watch and skip the relevant tests for it if so
         * Have $loop->later return a future instance if not passed any code
           (RT133240)

        [BUGFIXES]
         * Accept more error codes for failure to resolve missing hostname
           (RT131109)
         * Defend against some undef values at global destruction time
           (RT132677)

0.77    2020-05-13
        [CHANGES]
         * Updated for Metrics::Any 0.05
         * Report an info-type gauge metric to track loop types
         * Loop processing time should be a timer metric, not a distribution
         * Don't bother reporting zero-byte stream read/write metrics

        [BUGFIXES]
         * Skip metrics-related unit tests if metrics aren't active, even
           though we depend on Test::Metrics::Any
         * Account for MSWin32's EWOULDBLOCK in t/70future-io.t

0.76    2020-05-05
        [CHANGES]
         * Initial attempt at providing metrics via Metrics::Any
         * Renamed ->(un)watch_child API to ->(un)watch_process
         * Renamed 'child' LoopTests suite to 'process'

0.75    2019-11-26 00:06:59
        [CHANGES]
         * Remember to keep O_NONBLOCK off on IO::Async::Channel sync mode
           filehandles
         * Added IO::Async::Process->finish_future
         * Added IO::Async::Routine->result_future
         * Future-returning version of IO::Async::Function->stop
         * Don't load IO::Socket or Sereal modules unless required

        [BUGFIXES]
         * Refresh the sigpipe in ->post_fork if required (RT128588)
         * Fix some spelling mistakes (RT130087)
         * Skip the async getprotobyname() test if it doesn't work
           synchronously (RT131029)

0.74    2019-06-27 18:44:38
        [CHANGES]
         * Warn about IO::Async::Stream using autoflush on a blocking handle
         * Implement queuing priorities for IO::Async::Function calls (RT129918)
         * Send a terminating signal to a ->run_process process on cancellation
           (RT129225)
         * Optionally make ->run_process future fail when process exits non-zero
           (RT129225)
         * Implement the Future::IO->syswrite API

        [BUGFIXES]
         * Skip t/70future-io.t unless Future::IO is available (RT129807)
         * Remember to set O_NONBLOCK on IO::Async::Channel async mode
           filehandles (RT129879)
         * Handle Windows 7 which returns ENETDOWN to failed AF_UNIX connect()
           (RT129806)

0.73    2019-06-12 16:49:28
        [CHANGES]
         * Provide an IO::Async implementation of Future::IO
         * Added $loop->run_process (RT129225)
         * Clear $ONE_TRUE_LOOP in $loop->fork so that child processes can do
           IO::Async::Loop->new successfully
         * Added $notifier->adopted_futures accessor (RT127818)
         * Various docs fixes

0.72    2018-04-02 19:34:27
        [CHANGES]
         * Expanded docs on Stream's on_read sub return values
         * Overridable timeout for IO::Async::Test::wait_for
         * Hide IO::Async::ChildManager as an internal implementation detail;
           move the docs into main IO::Async::Loop
         * Added $loop->open_process; suggest using that instead of
           ->open_child
         * Begin implementation of $loop->is_running method (part of RT123780)

        [BUGFIXES]
         * Make IO::Async::Future->await wait until it's ready
         * Fix calculation of periodic timer in 'skip' mode (RT124414)
         * Perform synchronous getaddrinfo shortcut even for service-less
           lookups
         * Make sure that errors from underlying read/write functions are
           debug-logged by IO::Async::Stream

0.71    2016/12/22 15:05:50
        [CHANGES]
         * Added 'prefork' option to IO::Async::Channel (RT115920) - thanks
           GMARLER
         * Prefer Sereal Channel encoding if that module is available
         * Ensure that IaFunction still prints debug information on futures
         * Miscellaneous spelling fixes in docs - thanks genio

        [BUGFIXES]
         * 'use lib ".";' for perl 5.24
         * Make t/50resolver.t less sensitive to EAI_NONAME vs EAI_NODATA
           because some resolvers lie (RT113429)
         * Fix error message linefeed tests in t/50resolver.t (RT119369)
         * Ensure that SIGPIPE is ignored if it's still at its default value

0.70    2015/12/15 18:17:43
        [CHANGES]
         * Support perl 5.8.x (tested on 5.8.9, presumed working as far as
           5.8.4)

0.69    2015/11/09 19:56:58
        [CHANGES]
         * Use Future->catch instead of poorly-implemented string-eq test
         * Use L<...> instead of C<...> in docs where appropriate (RT107417)
           (thanks Arthur Axel 'fREW' Schmidt)

        [BUGFIXES]
         * Don't silently swallow Listener acceptor failures (RT107806)
         * Don't silently swallow other ->connect errors
         * Remember to ->unwatch_io before setting IaHandle's handle to undef

0.68    2015/07/31 20:07:48
        [CHANGES]
         * Allow IO::Async::Function body to 'die' with an ARRAYref to set
           more details on failed Future
         * Have IO::Async::Resolver calls indicate the failed resolver name
         * Have IO::Async::Resolver's getaddrinfo and getnameinfo resolvers
           give error numbers in failure result
         * Added 'init_code' parameter to IO::Async::Function (RT104127)
         * Added IO::Async::Channel->encode, ->send_encoded; deprecate the old
           ->send_frozen method
         * Added IO::Async::Test::wait_for_future
        
        [BUGFIXES]
         * Clean up after 'on_hangup' loop tests (RT106061)
         * Make ->stop + ->start on IO::Async::Timer::Periodic not forget the
           first_interval (RT100927)

0.67    2015/06/01 15:06:13
        [CHANGES]
         * Add a ->post_fork method to IO::Async::Loop in case subclasses
           should take specific action (RT104130)
         * Remove IO::Async::MergePoint entirely
         * Add debug_printf() calls to IO::Async::Process
         * Various documentation additions

        [BUGFIXES]
         * Remember to actually delete unused filehandles from the pollmask
           (RT103922)

0.66    2015/04/17 20:36:39
        [CHANGES]
         * Created IO::Async::Debug
         * Ignore SIGPIPE by default (RT92024)
         * IaSocket->bind now returns a Future
         * Added IaSocket->bind resolver support and neatened up UDP examples
           in synopsis/documentation

        [BUGFIXES]
         * Correct call to unpack() in IaStream example (RT103143)
         * Don't silently eat accept() failures in IaListener (RT102677)
         * Remember to add the new resolver instance to $loop in
           ->set_resolver (RT103446)
         * Correct implementation of ->unwatch_io on IaLoop::Poll to prevent
           100% CPU spin (RT103445)
         * Ensure that an exception thrown by Timer::Periodic's on_tick
           doesn't prevent rescheduling

0.65    2015/02/15 14:28:02
        [CHANGES]
         * Optionally allow IO::Async::Channel to use 'Sereal' serialisation
         * Added documentation about the 'env' Child Manager key and copying
           %ENV
         * Take OS "preferred loop subclass" hints from IO::Async::OS directly

        [BUGFIXES]
         * Nested $stream->read_* inside read_* cause double-completion of
           Future (RT101774)
         * Implement IO::Async::Loop::Poll directly on _poll() syscall
           wrapper, thus avoiding many bugs in IO::Poll (RT93141)
         * Ensure that IO::Async::Loop::Select can cope with callbacks that
           remove other IO handle watches (RT101919)
         * Silently upgrade watched IO handles to O_NONBLOCK (RT102044)
         * Complain about unrecognised keys to ->extract_addrinfo (RT101453)

0.64    2014/10/17 17:51:07
        [CHANGES]
         * Make specific mention of 'TCP' and 'UDP' around socket examples
           where appropriate
         * Allow construction of an IO::Async::Handle using fileno integers
           directly
         * Provide a better search for 'all open filehandles' via IO::Async::OS
           on Linux (RT97942)
         * Allow IO::Async::Listener to have handle_constructor or handle_class
           as a subclass method (RT97208)
         * Clarify documentation on how to use IO::Async::Process's
           on_exception event (RT98929)

        [BUGFIXES]
         * Ensure that Stream's write Futures are also informed of write errors
           (RT97433)
         * Remember to ->remove_child the individual workers of an
           IO::Async::Function (RT99552)
         * Fix IO::Async::Function synopsis example (RT97713)

0.63    2014/07/11 15:09:08
        [CHANGES]
         * Allow Notifier subclasses to last-ditch handle unrecognised
           ->configure() params
         * Added $notifier->adopt_future
         * Added $notifier->invoke_error and 'on_error' event
         * Ensure that TimeQueue inserts in FIFO order for equal timestamps
         * Kill remaining docs to long-dead IO::Async::Sequencer

        [BUGFIXES]
         * Cygwin needs the SELECT_CONNECT_EVEC OS hint as well
         * Probe for a broken port to perform listen() tests on by using
           ReuseAddr => 1 so it matches what IO::Async will do (RT84051)

0.62    2014/03/27 23:15:25
        [CHANGES]
         * Added IO::Async::Future->{done,fail}_later
         * Allow overriding of debug log file or file descriptor
         * Avoid Future's and_then/or_else methods
         * Allow Channel->recv in async mode to return a Future (RT91180)
         * Ensure that Function ->call Futures cancel correctly
         * Added $routine->kill
         * Kill the 'getaddrinfo' => 'getaddrinfo_array' legacy redirection
         * Allow Loop's resolver to be changed to a different object

        [BUGFIXES]
         * Avoid relying on strong forward references in Future, by creating
           intentional cycles on pending Futures. Workaround for bugfix in
           upcoming Future release.

0.61    2013/10/15 01:10:51
        [CHANGES]
         * Some OSes lack signals; forbid the ->*_signal methods, and use
           waitpid() polling for child processes if so
         * Rearrangement of $loop->listen and IO::Async::Listener logic to
           allow Listener subclasses to use listen extensions (e.g. SSL)
         * Allow ->listen to construct new Stream or Socket handles
         * Updated documentation and tests to emphasise futures with resolver
           and ->listen
         * Support spawning threads and watching for exit
         * Support IO::Async::Routine based on threads
         * Various MSWin32 improvements and fixes - it now passes tests \o/
         * Declare that MSWin32 does not support POSIX-like fork(); skip all
           unit tests and functionallity based on it if so

         Note: These changes break IO::Async::SSL versions 0.12 or older.

        [BUGFIXES]
         * Ensure that $stream->write( CODE, on_write/write_len ) works
           correctly

        With many thanks to Mithaldu for the use of his Windows smoker for
        development and testing of the MSWin32 fixes

0.60    2013/09/19 14:26:22
        [CHANGES]
         * Updated for Future 0.16 - no longer needs 'return' argument for
           Future::Utils functions
         * $stream->connect() ought to default socktype => "stream"

        [BUGFIXES]
         * Fix unit tests to better handle INADDR_LOOPBACK not being 127.0.0.1
         * Skip-guard ->socket("inet6") unit tests on machines unable to
           socket(AF_INET6)
         * Remmeber to ->accept connections to testing socket in
           t/63handle-connect.t

0.59    CHANGES:
         * Allow IO::Async::Stream to define custom reader/writer methods
         * Support writeready-for-read and readready-for-write in Stream
         * Allow Stream->write() on_write and write_len args
         * Neatened and documented Future ->fail arguments and conventions
         * Added Stream on_writeable_{start,stop} events
         * Added Handle->socket, ->bind and ->connect methods
         * Revamp of Loop->connect logic; allow passing through an
           IO::Async::Handle instance

        BUGFIXES:
         * Ensure that stream read EOF state is visible during queued on_read
           events that caused it
         * Fix 'return ... or die' precendence bug in Resolver (RT87051)
         * Need to poll() for POLLPRI on MSWin32 and Cygwin

0.58    CHANGES:
         * Added Stream read watermarks

        BUGFIXES:
         * Fix weakself event handlers' use of "shift or return"

0.57    CHANGES:
         * Allow Stream->write from a Future, CODE that returns Future, Future
           that returns CODE, etc...
         * Added Future-returning Stream->read_* methods and ->push_on_read
         * Return a flush-complete notification Future from Stream->write
         * Allow Timer::Periodic to stop itself from its own on_tick event
         * Wrap transport on_{read,write}_eof from Protocol::Stream

0.56    CHANGES:
         * Added $loop->delay_future and $loop->timeout_future
         * Added $future->loop accessor
         * Use a faster splice()-based mechanism for the ARRAY-based TimeQueue
         * Updated for Future::Utils 0.12 'repeat' function

        BUGFIXES:
         * Ensure that Process from => "" works
         * If select() returns -1 ignore the bit vectors
         * pipe() on Windows doesn't play with select(); emulate ->pipepair
           using ->socketpair
         * Correct use of S_ISREG and stat()

0.55    CHANGES:
         * Try to ensure IO::Async::OS->socket returns an IO::Socket::IP
           instance for PF_INET or PF_INET6 if it is available
         * Don't bother testing subsecond loop_once behaviour because most
           loops can't actually do it
         * Use Future::Utils instead of CPS, removing a dependency
         * Removed IO::Async::Sequencer
         * Print a deprecation warning on old loop classes with old timer
           support

0.54    CHANGES:
         * Use Future instead of CPS::Future
         * Created IO::Async::Future subclass
         * Initial support for Futures on Loops
         * Rewrite lots of internals to use Futures instead of MergePoints or
           other logic
         * Renamed all "task" to "future" in APIs
         * Allow packing of inet/inet6 address structures to omit the IP or
           port and presume passive or port 0
         * Removed $notifier->get_loop synonym
         * Make IO::Async::MergePoint throw a deprecation warning

0.53    CHANGES:
         * Added IO_ASYNC_WATCHDOG debugging support

        BUGFIXES:
         * Remember to return a task from Function->call even if it's queued
           (RT79248)

0.52    CHANGES:
         * Initial attempt at Tasks using CPS::Future
         * Minor fixes to timer LoopTests to prevent spurious failures of
           sub-second timing
         * Declare dependence on perl 5.10 now we're using 5.10 features
         * Removed long-since deprecated IO::Async::DetachedCode

0.51    CHANGES:
         * Split much code out to new IO::Async::OS heirarchy
         * Drop dead dependency on Test::Warn
         * Smaller simpler signal handling, avoid POSIX::SigSet
         * Expose getfamilybyname and getsocktypebyname as OS methods

        BUGFIXES:
         * Many small MSWin32 fixes that might help pass some tests. Likely
           still incomplete though

0.50    CHANGES:
         * Added IO::Async::File
         * Added filename mode of IO::Async::FileStream
         * Make Heap dependency optional by reimplementing a tiny but less
           efficient version of TimeQueue using a plain array
         * No longer need MB-only Build.PL

        BUGFIXES:
         * Round up select() and poll() timeouts to nearest milisecond, might
           help correct wait-time vs. gettimeofday() mismatches
         * Fake read- and write-readiness of S_ISREG filehandles in select()
           on MSWin32
         * select() for exceptional status on MSWin32 to check for connect()
           failures
         * Don't unit-test that getsockname() works on socketpair()ed sockets

0.49    CHANGES:
         * Fix watch_time => enqueue_timer conversions; fix unit tests and
           Timer implementations

0.48    CHANGES:
         * Support Channel long-running on_recv handler
         * Support Channel directly between two Routines, in sync. mode at
           both ends
         * Added Loop->{watch,unwatch}_time API
         * Added Function->restart and max_worker_calls parameter
         * Support other reschedule policies for Timer::Periodic to allow
           tick skipping, or drift

        BUGFIXES:
         * Fix example in Routine SYNOPSIS (thanks apeiron)
         * Connector should check definedness of local_{host,port} rather than
           existence

0.47    CHANGES:
         * Support $listener->listen( v6only => ... )
         * Added new data-passing $loop->run and $loop->stop methods

        BUGFIXES:
         * Emulate ->socketpair on MSWin32 by connecting to a temporary socket
         * Account for EWOULDBLOCK on MSWin32
         * Don't try reading STDIN to block awaiting a signal in unit-tests
         * Allow zero-delay Countdown timers (RT75954)
         * Handle dup2() collisions in ChildManager filehandle setups
           (RT75573)
         * Fix race condition in t/33process.t (RT75573)
         * Ensure Timer->stop doesn't fail if the timer isn't running
           (RT75571)
         * Possibly-fix some cygwin test failures (RT71706)
         * Ensure that 'passive' getaddrinfo hint is handled in both
           synchronous and numeric cases

0.46    ADDITIONS:
         * IO::Async::Routine + IO::Async::Channel
         * IO::Async::Process->kill method

        CHANGES:
         * Use Socket 1.93 rather than dual-dependency logic on
           Socket::GetAddrInfo
         * Rewrote ::Function based on ::Routine and ::Channel
         * Cleaner refcount behaviour in ::Process
         * ::Process no longer waits for EOF condition on write-only pipes
         * Don't unit-test the reading end of a pipe for HUP condition
         * Documentation updates
         * Removed documentation for long-since deprecated $loop->detach_child
           and ->detach_code methods

0.45    CHANGES:
         * Added Timer->is_expired predicate, remove_on_expire parameter
           (RT71767)

        BUGFIXES:
         * Use fd3/4 in ::Function rather than STDIN/STDOUT, to avoid
           corrupting the return channel if the body function prints (RT72448)
         * Better error detection around setuid/setgid/setgroups (RT72407)
         * IO::Handle->binmode is not available as a method before perl 5.12;
           use CORE::binmode() instead
         * Don't attempt to invoke a missing on_notifier callback in
           Loop->listen (RT71768)

0.44    CHANGES:
         * Allow Process to have sockets as handles; including datagram
           sockets

        BUGFIXES:
         * Extract TimeQueue entiries before firing them, in case they do
           something weird like cancelling themselves (RT70231)
         * Test dollarbang for EWOULDBLOCK which might help MSWin32
         * Cope correctly with Function handles in the presence of -CS or
           PERL_UNICODE=S

0.43    CHANGES:
         * Allow IO::Async::Notifier to be used as a non-principle mixin class
         * Provide Notifier->loop accessor
         * Added (still-experimental) Notifier debug features
         * Deleted various deprecated features:
            + Notifier to Handle upgrade
            + Loop->enable_childmanager, Loop->disable_childmanager
         * Print deprecation warnings on Loop->detach_code, Loop->detach_child
         * Minor improvements to LoopTests

0.42    BUGFIXES:
         * Test Stream encoding errors on a sequence which still returns
           U+FFFD immediately on 5.14.0 (RT69020)

0.41    CHANGES:
         * Support 'encoding' parameter in IO::Async::Stream
         * Allow IO::Async::Stream->write with an empty string, for the
           side-effect of setting an on_flush handler
         * Support 'first_interval' parameter to IO::Async::Timer::Periodic
         * Expanded documentation of timers
        
        BUGFIXES:
         * Explicitly 'use IO::Handle;'

0.40    ADDITIONS:
         * Added IO::Async::FileStream - RT66520
         * Added IO::Async::Stream 'close_on_read_eof' parameter
         * Added IO::Async::Listener 'on_accept_failure' event

        CHANGES:
         * Allow Loop->listen to be extended via extensions, similar to
           ->connect
         * Autoflush streams used in Function::Worker objects by default
         * Default Resolver to idle_timeout=30, min_workers=0

        BUGFIXES:
         * Don't convert method names to CODErefs during _capture_weakself as
           it breaks dynamic dispatch and code reload - RT65785
         * Only calculate Timer::Periodic's next tick time if it actually has
           a Loop
         * Put primary GID first in a 'setgroups' list, otherwise some BSDs
           get upset - RT65127
         * Load getaddrinfo() from Socket or Socket::GetAddrInfo in
           t/50resolver.t
         * Remove the anonymous Listener from the Loop if Loop->listen fails
           - RT66168
         * Supply LocalPort => 0 to IO::Socket::INET constructor explicitly
           during testing

0.39    CHANGES:
         * Added IO::Async::Notifier 'notifier_name' parameter, which may be
           used in debugging code in a later version
         * Added IO::Async::Stream on_write_eof event
         * Complain about unrecognised keys in IO::Async::Loop->watch_io and
           IO::Async::Stream->write

        BUGFIXES:
         * Don't claim on_hangup supported except on those places we know it
           will be (Linux, FreeBSD >= 8.0)
         * Fixed race condition in t/41detached-code.t
         * Fixed race condition in IO::Async::Function

0.38    ADDITIONS:
         * IO::Async::Function
         * IO::Async::Loop->notifiers accessor

        CHANGES:
         * Symbolic flags in IO::Async::Resolver as convenience for commonly
           used flag constants
         * Distribution now uses Test::Fatal rather than Test::Exception
         * Resolver is now a subclass of Function, not DetachedCode

        BUGFIXES:
         * More robust detection of Socket vs Socket::GetAddrInfo
         * Portability fix for ChildManager's FD_CLOEXEC flag

0.37    ADDITIONS:
         * Handle->close_read, ->close_write
         * Stream on_read_eof event
         * extract_addrinfo conveniences for 'inet', 'inet6' and 'unix'

        CHANGES:
         * Allow Process filehandles to set up plain pipes without read/write
           behaviour on the associated Stream
         * Renamed Loop->unpack_addrinfo to ->extract_addrinfo
         * Prepare for Socket::getaddrinfo() in core; prefer it to
           Socket::GetAddrInfo::getaddrinfo()

0.36    ADDITIONS:
         * IO::Async::Process

        CHANGES:
         * Allow prequeuing of ->write data in Stream
         * Check that signal handling remains properly deferred in LoopTests
         * Miscellaneous documentation and examples updates

        BUGFIXES:
         * RT 64558 - getaddrinfo() returns duplicate addresses for localhost
         * Don't rely on having NI_NUMERICSERV

0.35    ADDITIONS:
         * Loop->unpack_addrinfo

        CHANGES:
         * Recognise 'inet' and 'unix' as socket families
         * Recognise 'stream', 'dgram' and 'raw' as socket types
         * Recognise nicer HASH-based addrinfo layout in ->connect and
           ->listen
         * Listener now has on_stream / on_socket as full events, not just
           CODEref parameters
         * Make Resolver->getaddrinfo try synchronously if given numeric names
         * Make Resolver->getnameinfo run synchronously if given
           NI_NUMERICHOST|NI_NUMERICSERV flags
         * Try to combine small data buffers from Stream->write calls if
           possible

        BUGFIXES:
         * Linefeed in die case of getaddrinfo_hash to preserve exeception
           string
         * Deconfigure Protocol->transport after it is closed

0.34    ADDITIONS:
         * New Notifier methods ->_replace_weakself, ->maybe_invoke_event,
           ->maybe_make_event_cb
         * New Protocol method ->connect
         * New subclass Protocol::LineStream
         * Direct Resolver->getaddrinfo and ->getnameinfo methods

        CHANGES:
         * New Protocol::Stream->new( handle => $io ) parameters, which
           creates an IO::Async::Stream to use as a transport
         * Renamed Loop->detach_child to Loop->fork
         * Pass errno values into ->connect on_connect_error and
           ->listen on_listen_error
         * Support timeouts on Resolver operations
         * Allow direct access to Resolver via Loop->resolver

        BUGFIXES:
         * Make sure Protocol::Stream handles writersub and on_flush callback

0.33    ADDITIONS:
         * Allow watching child PID 0, to capture every child process exit
         * $loop->time accessor
         * Stream->write( sub { ... } ) dynamic stream generation
         * Stream->write( $data, on_flush => sub { ... } ) callback

        CHANGES:
         * IO::Async::Loop->new magic constructor now caches the loop; useful
           for wrapping modules, other event system integration, etc..

0.32    ADDITIONS:
         * IO::Async::Timer::Absolute
         * Listener accessors for ->sockname, ->family, ->socktype

        CHANGES:
         * Implement and document Handle's want_{read,write}ready parameters
         * Rearranged documentation for Notifier subclasses; new EVENTS
           sections
         * Correct location for #io-async channel on irc.perl.org

0.31    ADDITIONS:
         * Delegate Protocol->close method and on_closed continuation to its
           transport object
         * Stream->new_for_stdin, ->new_for_stdout, ->new_for_stdio
         * Support Listener->new( handle => $fh )
         * IO::Async::PID notifier subclass

        CHANGES:
         * Better documentation of Listener and Connector addr and addrs
           arguments

        BUGFIXES:
         * INADDR_ANY/INADDR_LOOPBACK fixes inside BSD jails with restricted
           networking

0.30    ADDITIONS:
         * Added IO::Async::Socket
         * Added IO::Async::Protocol and ::Protocol::Stream
         * Added on_stream and on_socket continuations for $loop->connect and
           Listener

        CHANGES:
         * Emulate socketpair(AF_INET,...)
         * Allow IO::Async::Stream 's read_len and write_len to be configured
           per-instance
         * Allow a Stream object without an on_read handler

        BUGFIXES:
         * Cope with exceptional-state sockets in Loop::Poll

0.29    CHANGES:
         * Don't require 'CODE' refs for callbacks/continations; this allows
           the use of CODEref objects, &{} operator overloads, or other things
           that are callable
         * Implement 'read_all' and 'write_all' options on IO::Async::Stream
         * Allow IO::Async::Stream subclasses to override on_closed

        BUGFIXES:
         * Work around some OSes not implementing SO_ACCEPTCONN
         * Ensure Handle's on_read_ready/on_write_ready callbacks also take a
           $self reference

0.28    BUGFIXES:
         * Ensure that Timer->start returns $self even when not in a Loop
         * Accept bare GLOB refs as IO::Async::Listener handles; upgrade them
           to IO::Socket refs if required
         * Applied documentation patch from RT 55375 - thanks to
           Chris Williams

0.27    CHANGES:
         * Implement 'autoflush' option on IO::Async::Stream

        BUGFIXES:
         * Avoid $_ breaking stored signal handler references when invoking
           them
         * Ignore EINTR from sysread/syswrite
         * More reliable socket address tests - don't rely on uninitialised
           padding bytes between struct members

0.26    BUGFIXES:
         * Connect to INADDR_LOOPBACK rather than INADDR_ANY during
           t/24listener.t; hopefully fixes FAILs on OpenBSD
         * Fix IO::Async::Stream during combined read/write-ready of a closed
           stream

0.25    CHANGES:
         * Accept 'stream'/'dgram'/'raw' as symbolic shortcuts for socket
           types in connect/listen operations - avoids 'use Socket'
         * Accept IO::Handle-derived objects in ChildManager setup keys as
           well as raw GLOB refs

        BUGFIXES:
         * Various changes to test scripts to hopefully improve portability or
           reliability during smoke tests

0.24    ADDITIONS:
         * Timer subclasses - Countdown and Periodic
         * Idleness event watching via low-level 'watch_io/unwatch_io' methods
           and higher-level 'later' method
         * Added the missing 'unwatch_child' method
         * Shareable acceptance testing suite for IO::Async::Loop subclasses
           for better testing in subclass implementations

        CHANGES:
         * More future-proof API version checking for subclasses - requires
           subclasses to declare their version. 
           ### pre-0.24 Loop subclasses are no longer compatible. ###
         * Entirely remove the need to $loop->enable_childmanager by calling
           waitpid() in 'watch_child'.

0.23    CHANGES:
         * Rearranged IO::Async::Listener to be a constructable Notifier
           suclass
         * Allow Signal, Timer and Listener to act as base classes as well as
           standalone with callbacks
         * Renamed IO::Async::Loop::IO_Poll to ::Poll; created transparent
           backward-compatibility wrapper

0.22    CHANGES:
         * Added tcp-proxy.pl example
         * More documentation on IO::Async::Notifier subclass-override methods
         * Documented that IO::Async::MergePoint is just an Async::MergePoint
         * Various small updates to keep CPANTS happy

        BUGFIXES:
         * Don't test Async::MergePoint locally as it's now a separate dist,
           and the tests here were reporting false negatives.

0.21    CHANGES:
         * Added "use warnings" to all modules
         * Created Notifier->configure method to allow changing properties of
           a Notifier or subclass after construction
         * New 'examples' dir with some small example scripts

        BUGFIXES:
         * More robust timing tests to avoid some spurious test failures due
           to busy testing servers or other non-issues

0.20    CHANGES:
         * Major reworking of underlying Loop implementation:
            + Unified low-level IO, timer and signal watches as callbacks
            + Split IO handle parts of Notifier into new IO::Async::Handle
              class
            + Created Timer and Signal subclasses of Notifier

           These changes will require a compatible upgrade to the underlying
           Loop implementation.

         * Hide SignalProxy and TimeQueue from CPAN's indexer, as they are
           internal-only details that don't need exposing there.
         * Loop magic constructor now warns if a specifically-requested class
           is not available
         * Allow multiple attachment of signals via Loop->attach_signal or new
           Signal objects

0.19    CHANGES:
         * Allow control of Sequencer's pipelining
         * Documentation fixes
         * Allow Loop->run_child to take a 'setup' array
         * Added 'setuid', 'setgid' and 'setgroups' child setup operations
         * Support 'on_notifier' in Loop->listen

        BUGFIXES:
         * carp before return in Stream->write so it actually prints
         * Ensure Streams still work after being closed and reopened by
           ->set_handle
         * If IO::Socket->new() fails, try again with generic ->socket
           (makes IPv6 work on platforms without IO::Socket::INET6)

0.18    CHANGES:
         * Allow Sequencer to be a base class as well as using constructor
           callbacks
         * Use signal names from Config.pm rather than relying on POSIX.pm.
           Covers more signals that way

        BUGFIXES:
         * Gracefully handle accept() returning EAGAIN
         * Fixed handling of IO::Socket->getsockopt( SOL_SOCKET, SO_ERROR )

0.17    CHANGES:
         * Added Stream->close_when_empty and ->close_now. Added docs
         * Added OS abstractions of socketpair() and pipe()
         * Many documentation changes and updates

        BUGFIXES:
         * Properly handle stream read/write errors; close immediately rather
           than deferring until empty.
         * Various CPAN testers somketest bug fixes
         * Fixed http://rt.cpan.org/Ticket/Display.html?id=38476

0.16    ADDITIONS:
         * Loop->requeue_timer()
         * Magic constructor in IO::Async::Loop which tries to find the best
           subclass
         * 'chdir' and 'nice' ChildManager operations

        CHANGES:
         * Make sure that top-level objects are refcount-clean by using
           Test::Refcount, and Scalar::Util::weaken()

        BUGFIXES:
         * Keep perl 5.6.1 happy by not passing LocalPort => 0 when
           constructing IO::Socket::INETs
         * Pass the Type option to IO::Socket::INET constructor in test
           scripts

0.15    REMOVALS:
         * IO::Async::Set subclasses and IO::Async::Buffer have now been
           entirely removed.

        CHANGES:
         * Support handle-less IO::Async::Sequencer, like ::Notifier
         * Set SO_REUSEADDR on listening sockets by default
         * Allow Loop->listen() on a plain filehandle containing a socket
         * No longer any need to explcitly call Loop->enable_childmanager

        BUGFIXES:
         * IO::Async::Loop->_adjust_timeout actually works properly
         * Notifier->close() only runs on_closed callback if it actually 
           closed - allows for neater cross-connected Notifiers
         * Made Notifier->want_{read,write}ready more efficient
         * Notifier->close() on a child notifier works
         * Loop->listen() should take the first successful address, rather
           than trying them all

0.14    REMOVALS:
         * IO::Async::Set subclasses and IO::Async::Buffer are now completely
           deprecated. Any attempt to use them will fail immediately.

        ADDITIONS:
         * 'keep' ChildManager operation
         * IO::Async::Test::wait_for_stream()
         * Loop->listen()
         * IO::Async::Sequencer class

        CHANGES:
         * Support dynamic swapping of temporary 'on_read' handlers in Stream
         * Now requires Socket::GetAddrInfo >= 0.08
         * Further shortcuts in ChildManager setup keys - IO references and
           simple string operation names
         * Support handle-less IO::Async::Notifiers that have IO handles added
           to them later
         * Allow 'setup' key to Loop->detach_code()
         * Various documentation updates

        BUGFIXES:
         * Allow the same filehandle to be 'dup'ed more than once in
           ChildManager

0.13    CHANGES:
         * Flush all awaiting data from Stream when it becomes writeready
         * Supply a real IO::Async::Test module to allow testing in 3rd party
           distros
         * Various documentation fixes

        BUGFIXES:
         * Don't rely on STDOUT being writable during test scripts

0.12    CHANGES:
         * Allow Notifiers that are write-only.
         * Added ChildManager->open and ->run; with ->open_child and 
           ->run_child on the containing Loop.
         * Moved IO::Async::Loop::Glib out to its own CPAN dist, to
           simplify Build.PL and testing scripts

        BUGFIXES:
         * Make sure to "use IO::Socket" in IO::Async::Connector
         * Pass 'socktype' argument to ->connect during testing

0.11    INCOMPATIBLE CHANGES:
         * Renamed IO::Async::Set::* to IO::Async::Loop::* - provided
           backward-compatibility wrappers around old names. 
           IO::Async::Set::GMainLoop has become IO::Async::Lib::Glib
         * Renamed IO::Async::Buffer to IO::Async::Stream - provided backward-
           compatibility wrapper around old name.
         * Loop->get_childmanager() and ->get_sigproxy() no longer allowed

        CHANGES:
         * Extended ->loop_once() and ->loop() feature out to all
           IO::Async::Loop classes
         * Added IO::Async::Resolver and IO::Async::Connector, plus Loop
           integration
         * Allow write-only IO::Async::Notifiers that have no read handle or
           readiness callback.

0.10    INCOMPATIBLE CHANGES:
         * Renamed events and methods in IO::Async::Notifier to better fit the
           naming scheme of normal Perl handles. Backward-compatibility hooks
           are currently provided, but will be removed in a later release. Any
           code using the old names should be updated

        CHANGES:
         * Allow DetachedCode to have multiple back-end worker processes.
         * Control if a back-end worker exits when the code "die"s
         * Added 'close()' method on Notifiers/Buffers. Sensible behaviour on
           buffers with queued data to send
         * Reset %SIG hash in ChildManager->detach_child()

        BUGFIXES:
         * Clean up temporary directory during testing
         * Shut down DetachedCode workers properly on object deref
         * Better handling of borderline timing failures in t/11set-*.t
         * Close old handles before dup2()ing new ones when detaching code
         * Various other minor test script improvements

0.09    CHANGES:
         * Added TimeQueue object and integration with IO::Async::Set and
           subclasses.
         * Added MergePoint object
         * Added 'on_closed' callback support to IO::Async::Notifier

        BUGFIXES:
         * Don't depend on system locale when checking string value of $!
         * Fixed test scripts to more closely approximate real code behaviour
           in the presence of poll() vs. deferred signal delivery

0.08    CHANGES:
         * Added ChildManager->detach_child() method
         * Added DetachedCode object

        BUGFIXES:
         * Better tests for presence of Glib to improve test false failures
         * More lenient times in test script 11set-IO-Poll-timing to allow for
           variances at test time
         * Avoid bugs in post_select()/post_poll() caused by some notifier
           callbacks removing other notifiers from the set

0.07    BUGFIXES:
         * Avoid race condition in t/30childmanager.t - wait for child process
           to actually exit
         * Avoid race condition in IO::Async::ChildManager->spawn() by waiting
           for SIGCHLD+pipe close, rather than SIGCHLD+pipe data

0.06    CHANGES:
         * Allow 'env' setup key to ChildManager->spawn() to change the
           child's %ENV
         * Updated the way some of the ->spawn() tests are conducted. There
           seems to be massive failures reported on cpantesters against 0.05.
           These changes won't fix the bugs, but should assist in reporting
           and tracking them down.

        BUGFIXES:
         * Don't rely on existence of /bin/true - test for /usr/bin/true as
           well, fall back on "$^X -e 1"
         * Avoid kernel race condition in t/32childmanager-spawn-setup.t by
           proper use of select() when testing.

0.05    CHANGES:
         * Added ChildManager object
         * Added singleton storage in IO::Async::Set to store a SignalProxy or
           ChildManager conveniently

        BUGFIXES:
         * Workaround for a bug in IO::Poll version 0.05

0.04    CHANGES:
         * Added dynamic signal attach / detach methods to SignalProxy
         * Buffer now has on_read_error / on_write_error callbacks for
           handling IO errors on underlying sysread()/syswrite() calls

0.03    CHANGES:
         * No longer build_requires 'Glib' - print a warning if it's not
           installed but carry on anyway.
         * IO_Poll->loop_once() now returns the result from the poll() call
         * Added concept of nested child notifiers within Notifier object

        BUGFIXES:
         * Fix to test scripts that call IO_Poll's loop_once() with a timeout
           of zero. This can cause a kernel race condition, so supply some
           small non-zero value instead.

0.02    INCOMPATIBLE CHANGES:
         * Event methods/callback functions now called "on_*" to distinguish
           them
         * Callback functions now pass $self as first argument to simplify
           called code

        CHANGES:
         * Improved POD in Notifier.pm and Buffer.pm

        BUGFIXES:
         * GMainLoop.pm - return 1 from callbacks so that glib doesn't remove
           our IO sources
         * GMainLoop.pm - make sure re-asserting want_writeready actually adds
           the IO source again

0.01    First version, released on an unsuspecting world.