Author: bdonlan
Date: 2004-06-28 23:02:47 -0400 (Mon, 28 Jun 2004)
New Revision: 274
Added:
trunk/misc/poe-signal/
trunk/misc/poe-signal/Build
trunk/misc/poe-signal/Build.PL
trunk/misc/poe-signal/COPYING
trunk/misc/poe-signal/MANIFEST
trunk/misc/poe-signal/MANIFEST.SKIP
trunk/misc/poe-signal/lib/
trunk/misc/poe-signal/lib/POE/
trunk/misc/poe-signal/lib/POE/Session/
trunk/misc/poe-signal/lib/POE/Session/EventSource.pm
trunk/misc/poe-signal/t/
trunk/misc/poe-signal/t/01_basic.t
trunk/misc/poe-signal/t/02_signal_all.t
trunk/misc/poe-signal/t/02_signal_specific.t
trunk/misc/poe-signal/t/03_signal_multiple.t
trunk/misc/poe-signal/t/03_unregister.t
trunk/misc/poe-signal/t/04_clear.t
Log:
Adding POE::Session::EventSource
Added: trunk/misc/poe-signal/Build
===================================================================
--- trunk/misc/poe-signal/Build 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/Build 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+BEGIN {
+ $^W = 1; # Use warnings
+ my $start_dir = '/home/bdonlan/src/mine/haver/misc/poe-signal';
+ chdir($start_dir) or die "Cannot chdir to $start_dir: $!";
+ @INC =
+ (
+ '/home/bdonlan/src/mine/haver/main/client/lib',
+ '/home/bdonlan/src/mine/haver/main/common/lib',
+ '/home/bdonlan/src/mine/haver/main/server/lib',
+ '/home/bdonlan/src/mine/haver/misc/mbot/lib',
+ '/home/bdonlan/src/mine/haver/misc/poe-inherit/lib',
+ '/home/bdonlan/src/mine/haver/haver-gtk/lib',
+ '/home/bdonlan/myperl/lib/i686-linux',
+ '/home/bdonlan/myperl/lib',
+ '/etc/perl',
+ '/usr/lib/perl5/site_perl/5.8.4/i686-linux',
+ '/usr/lib/perl5/site_perl/5.8.4',
+ '/usr/lib/perl5/site_perl/5.8.2/i686-linux',
+ '/usr/lib/perl5/site_perl/5.8.2',
+ '/usr/lib/perl5/site_perl/5.8.0/i686-linux',
+ '/usr/lib/perl5/site_perl/5.8.0',
+ '/usr/lib/perl5/site_perl',
+ '/usr/lib/perl5/vendor_perl/5.8.4/i686-linux',
+ '/usr/lib/perl5/vendor_perl/5.8.4',
+ '/usr/lib/perl5/vendor_perl/5.8.2/i686-linux',
+ '/usr/lib/perl5/vendor_perl/5.8.2',
+ '/usr/lib/perl5/vendor_perl/5.8.0/i686-linux',
+ '/usr/lib/perl5/vendor_perl/5.8.0',
+ '/usr/lib/perl5/vendor_perl',
+ '/usr/lib/perl5/5.8.4/i686-linux',
+ '/usr/lib/perl5/5.8.4',
+ '/usr/local/lib/site_perl',
+ '/usr/lib/perl5/site_perl/5.8.2/i686-linux',
+ '/usr/lib/perl5/site_perl/5.8.2',
+ '/usr/lib/perl5/site_perl/5.8.0/i686-linux',
+ '/usr/lib/perl5/site_perl/5.8.0',
+ '/home/bdonlan/src/mine/haver/misc/poe-signal'
+ );
+}
+
+use Module::Build;
+
+# This should have just enough arguments to be able to bootstrap the rest.
+my $build = resume Module::Build (
+ properties => {
+ config_dir => '/home/bdonlan/src/mine/haver/misc/poe-signal/_build',
+ },
+);
+
+$build->dispatch;
Property changes on: trunk/misc/poe-signal/Build
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/misc/poe-signal/Build.PL
===================================================================
--- trunk/misc/poe-signal/Build.PL 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/Build.PL 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+use Module::Build;
+my $build = Module::Build->new(
+ module_name => 'POE::Session::EventSource',
+ license => 'gpl',
+ requires => {
+ 'perl' => '5.6.1',
+ POE => '0.28',
+ 'POE::Session::Inheritable' => 0.01,
+ },
+ create_makefile_pl => 'passthrough',
+);
+
+
+$build->create_build_script;
Property changes on: trunk/misc/poe-signal/Build.PL
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/misc/poe-signal/COPYING
===================================================================
--- trunk/misc/poe-signal/COPYING 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/COPYING 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,326 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it
+to your programs, too.
+
+ When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+ To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And you
+must show them these terms so they know their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and modification
+follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program
+is not restricted, and the output from the Program is covered only if its
+contents constitute a work based on the Program (independent of having been
+made by running the Program). Whether that is true depends on what the
+Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's source code
+as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License,
+and its terms, do not apply to those sections when you distribute them as
+separate works. But when you distribute the same sections as part of a whole
+which is a work based on the Program, the distribution of the whole must be on
+the terms of this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with
+the Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+ 3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel, and
+so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with the
+object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not signed
+it. However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance of
+this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms and
+conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or otherwise)
+that contradict the conditions of this License, they do not excuse you from
+the conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions of
+the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of this License,
+you may choose any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
+LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
+THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey the
+exclusion of warranty; and each file should have at least the "copyright" line
+and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
Added: trunk/misc/poe-signal/MANIFEST
===================================================================
--- trunk/misc/poe-signal/MANIFEST 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/MANIFEST 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,11 @@
+Build.PL
+COPYING
+lib/POE/Session/EventSource.pm
+MANIFEST This list of files
+MANIFEST.SKIP
+t/01_basic.t
+t/02_signal_all.t
+t/02_signal_specific.t
+t/03_signal_multiple.t
+t/03_unregister.t
+t/04_clear.t
Added: trunk/misc/poe-signal/MANIFEST.SKIP
===================================================================
--- trunk/misc/poe-signal/MANIFEST.SKIP 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/MANIFEST.SKIP 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,11 @@
+\.old$
+\.bak
+store
+blib
+_build
+^Build$
+^\.#
+\.svn
+\.tar\.gz$
+/\..*\.swp$
+~$
Added: trunk/misc/poe-signal/lib/POE/Session/EventSource.pm
===================================================================
--- trunk/misc/poe-signal/lib/POE/Session/EventSource.pm 2004-06-28
06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/lib/POE/Session/EventSource.pm 2004-06-29
03:02:47 UTC (rev 274)
@@ -0,0 +1,226 @@
+# vim: set ft=perl ts=4 sw=4:
+# POE::Session::EventSource - event generation, dispatch, registering logic
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+=head1 NAME
+
+POE::Session::EventSource - event dispatch module for POE sessions
+
+=head1 SYNOPSIS
+
+ use base 'POE::Session::EventSource';
+
+ sub new {
+ my ($class, @args) = @_;
+ my $self = $class->SUPER::new(prefix => 'foosource_');
+
+ [...]
+ }
+
+ sub somehandler {
+ [...]
+ $kernel->yield('_dispatch', 'foo', @args);
+ }
+
+ # In some other session's code
+ $kernel->post('somesession', 'register', 'all');
+ $kernel->post('somesession', 'unregister', 'bar');
+
+=head1 DESCRIPTION
+
+POE::Session::EventSource is a module for broadcasting events from a
+session providing an event source to multiple client sessions. This session
+uses POE::Session::Inheritable - see its documentation for important
information
+on how indirectly derived modules must work.
+
+=head1 METHODS
+
+=cut
+
+package POE::Session::EventSource;
+
+use strict;
+use warnings;
+
+use base 'POE::Session::Inheritable';
+use Carp;
+use POE;
+
+our $VERSION = 0.01;
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ register _register
+ unregister _unregister
+ _dispatch _dispatch
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+=head2 new([prefix => $Z<>prefix])
+
+Creates a new instance of a POE::Session::EventSource. $prefix, if present,
+will be prepended to all events to obtain the event name to be dispatched to
+client sessions.
+
+=cut
+
+sub new {
+ my ($class, %args) = @_;
+ if ((ref $class || $class) eq __PACKAGE__
+ and !$args{force_nosuper}) {
+ carp "Warning! You probably don't want to create an instance of
POE::Session::EventSource directly.\n",
+ "If you're sure, you can suppress this warning by
passing force_nosuper => 1";
+ }
+ my $self = $class->SUPER::new();
+
+ if ($args{prefix}) {
+ $self->{prefix} = $args{prefix};
+ } else {
+ $self->{prefix} = '';
+ }
+
+ return $self;
+}
+
+=head2 $Z<>self->_clear_registrations()
+
+Erases all present registrations, decrementing reference counts as necessary.
+This will automatically be called when your session is destroyed.
+
+=cut
+
+sub _clear_registrations {
+ my $self = shift;
+ for my $container (values %{$self->{reg}}) {
+ # Reset the iterator. Probably not necessary,
+ # but just to be sure...
+ keys %$container;
+ while (my ($id, $tag) = each %$container) {
+ $poe_kernel->refcount_decrement($id, $tag);
+ }
+ }
+ $self->{reg} = {};
+}
+
+
+=head1 EVENTS
+
+=head2 register(@Z<>events)
+
+Registers for the specified list of events. The special 'all' event can be used
+to receive all events.
+
+=cut
+
+sub _register {
+ my ($self, $kernel, $session, $sender, @events) =
+ @_[OBJECT,KERNEL,SESSION,SENDER,ARG0..$#_];
+ my $id = $sender->ID;
+ my $myid = $session->ID;
+ for my $event (@events) {
+ my $container;
+ $container = $self->{reg}{$event};
+ if (!$container) {
+ $container = $self->{reg}{$event} = {};
+ }
+ next if exists $container->{$id};
+ # POE refcounts require a name for the reference. We generate
one
+ # from our session ID, the registering session ID, and the event
+ my $tag = "$myid##$id##$event";
+ $kernel->refcount_increment($sender->ID, $tag);
+ $container->{$id} = $tag;
+ }
+}
+
+=head2 unregister(@Z<>events)
+
+Unregisters from receiving the specified list of events. Note that
+unregistering from 'all' does not unregister any other events, and vice-versa.
+
+=cut
+
+sub _unregister {
+ my ($self, $kernel, $sender, @events) =
+ @_[OBJECT,KERNEL,SENDER,ARG0..$#_];
+ my $id = $sender->ID;
+ for my $event (@events) {
+ my $container;
+ $container = $self->{reg}{$event};
+ next unless $container;
+ next unless exists $container->{$id};
+ $kernel->refcount_decrement($sender->ID, $container->{$id});
+ delete $container->{$id};
+ }
+}
+
+=head2 _dispatch($Z<>event, @Z<>args)
+
+Dispatches the specified, with the specified arguments, to all registered
+listeners.
+
+=cut
+
+sub _dispatch {
+ my ($self, $kernel, $event, @args) = @_[OBJECT,KERNEL,ARG0..$#_];
+ my %targets;
+
+ %targets = (
+ map { $_ => 1 } keys %{$self->{reg}{all}},
+ map { $_ => 1 } keys %{$self->{reg}{$event}},
+ );
+
+ for (keys %targets) {
+ $kernel->post($_, $self->{prefix} . $event, @args);
+ }
+}
+
+sub DESTROY {
+ my $self = shift;
+ $self->_clear_registrations($self);
+}
+
+=head1 SEE ALSO
+
+L<POE::Session::Inheritable>
+L<POE>
+
+=head1 AUTHOR
+
+Bryan Donlan, E<lt>[EMAIL PROTECTED]<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2004 by Bryan Donlan, Dylan William Hardison
+
+This library is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this module; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+=cut
Property changes on: trunk/misc/poe-signal/lib/POE/Session/EventSource.pm
___________________________________________________________________
Name: svn:eol-style
+ native
Added: trunk/misc/poe-signal/t/01_basic.t
===================================================================
--- trunk/misc/poe-signal/t/01_basic.t 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/t/01_basic.t 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,26 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+use Test::More tests => 1;
+
+BEGIN {
+ use_ok('POE::Session::EventSource');
+}
+
+
Added: trunk/misc/poe-signal/t/02_signal_all.t
===================================================================
--- trunk/misc/poe-signal/t/02_signal_all.t 2004-06-28 06:01:04 UTC (rev
273)
+++ trunk/misc/poe-signal/t/02_signal_all.t 2004-06-29 03:02:47 UTC (rev
274)
@@ -0,0 +1,66 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package main;
+
+use Test::More tests => 1;
+
+use POE;
+use base 'POE::Session::EventSource';
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ _start start
+ foo foo
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+sub start {
+ $poe_kernel->alias_set('source');
+ $poe_kernel->yield('foo');
+}
+
+sub foo {
+ $poe_kernel->yield('_dispatch', 'foo', 42);
+ $poe_kernel->alias_remove('source');
+}
+
+sub new {
+ return $_[0]->SUPER::new(prefix => 'foo_');
+}
+
+my $ok = 0;
+
+POE::Session->create(
+ inline_states => {
+ _start => sub {
+ main->new();
+ $poe_kernel->post('source', 'register', 'all');
+ },
+ foo_foo => sub {
+ $ok = 1;
+ },
+ }
+);
+
+POE::Kernel->run();
+
+ok($ok, 'Basic dispatch using all registration');
Added: trunk/misc/poe-signal/t/02_signal_specific.t
===================================================================
--- trunk/misc/poe-signal/t/02_signal_specific.t 2004-06-28 06:01:04 UTC
(rev 273)
+++ trunk/misc/poe-signal/t/02_signal_specific.t 2004-06-29 03:02:47 UTC
(rev 274)
@@ -0,0 +1,66 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package main;
+
+use Test::More tests => 1;
+
+use POE;
+use base 'POE::Session::EventSource';
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ _start start
+ foo foo
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+sub start {
+ $poe_kernel->alias_set('source');
+ $poe_kernel->yield('foo');
+}
+
+sub foo {
+ $poe_kernel->yield('_dispatch', 'foo', 42);
+ $poe_kernel->alias_remove('source');
+}
+
+sub new {
+ return $_[0]->SUPER::new(prefix => 'foo_');
+}
+
+my $ok = 0;
+
+POE::Session->create(
+ inline_states => {
+ _start => sub {
+ main->new();
+ $poe_kernel->post('source', 'register', 'foo');
+ },
+ foo_foo => sub {
+ $ok = 1;
+ },
+ }
+);
+
+POE::Kernel->run();
+
+ok($ok, 'Basic dispatch using specific registration');
Added: trunk/misc/poe-signal/t/03_signal_multiple.t
===================================================================
--- trunk/misc/poe-signal/t/03_signal_multiple.t 2004-06-28 06:01:04 UTC
(rev 273)
+++ trunk/misc/poe-signal/t/03_signal_multiple.t 2004-06-29 03:02:47 UTC
(rev 274)
@@ -0,0 +1,76 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package main;
+
+use Test::More tests => 1;
+
+use POE;
+use base 'POE::Session::EventSource';
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ _start start
+ foo foo
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+sub start {
+ $poe_kernel->alias_set('source');
+}
+
+sub foo {
+ $poe_kernel->yield('_dispatch', 'foo', 42);
+ $poe_kernel->alias_remove('source');
+}
+
+sub new {
+ return $_[0]->SUPER::new(prefix => 'foo_');
+}
+
+my $ok = 0;
+
+POE::Session->create(
+ inline_states => {
+ _start => sub {
+ main->new();
+ $poe_kernel->post('source', 'register', 'all');
+ POE::Session->create(
+ inline_states => {
+ _start => sub {
+ $poe_kernel->post('source',
'register', 'foo');
+ $poe_kernel->post('source',
'foo');
+ },
+ foo_foo => sub {
+ $ok++;
+ }
+ }
+ );
+ },
+ foo_foo => sub {
+ $ok++;
+ },
+ }
+);
+
+POE::Kernel->run();
+
+ok($ok == 2, 'Multiple dispatch');
Added: trunk/misc/poe-signal/t/03_unregister.t
===================================================================
--- trunk/misc/poe-signal/t/03_unregister.t 2004-06-28 06:01:04 UTC (rev
273)
+++ trunk/misc/poe-signal/t/03_unregister.t 2004-06-29 03:02:47 UTC (rev
274)
@@ -0,0 +1,67 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package main;
+
+use Test::More tests => 1;
+
+use POE;
+use base 'POE::Session::EventSource';
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ _start start
+ foo foo
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+sub start {
+ $poe_kernel->alias_set('source');
+ $poe_kernel->yield('foo');
+}
+
+sub foo {
+ $poe_kernel->yield('_dispatch', 'foo', 42);
+ $poe_kernel->alias_remove('source');
+}
+
+sub new {
+ return $_[0]->SUPER::new(prefix => 'foo_');
+}
+
+my $ok = 1;
+
+POE::Session->create(
+ inline_states => {
+ _start => sub {
+ main->new();
+ $poe_kernel->post('source', 'register', 'all');
+ $poe_kernel->post('source', 'unregister', 'all');
+ },
+ foo_foo => sub {
+ $ok = 0;
+ },
+ }
+);
+
+POE::Kernel->run();
+
+ok($ok, 'unregister');
Added: trunk/misc/poe-signal/t/04_clear.t
===================================================================
--- trunk/misc/poe-signal/t/04_clear.t 2004-06-28 06:01:04 UTC (rev 273)
+++ trunk/misc/poe-signal/t/04_clear.t 2004-06-29 03:02:47 UTC (rev 274)
@@ -0,0 +1,76 @@
+# vim: set ft=perl ts=4 sw=4:
+# 01_basic.t - tests for POE::Session::EventSource
+#
+# Copyright (C) 2004 Bryan Donlan, Dylan William Hardison.
+#
+# This module is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This module is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this module; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+package main;
+
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+use POE;
+use base 'POE::Session::EventSource';
+
+sub _object_states {
+ my ($self, $ehash) = @_;
+ $ehash = {qw{
+ _start start
+ foo foo
+ buffer buffer
+ }, %$ehash};
+ return $self->SUPER::_object_states($ehash);
+}
+
+sub start {
+ $poe_kernel->alias_set('source');
+ $poe_kernel->yield('buffer');
+}
+
+sub buffer {
+ # Make sure there's time for the client session to register before we
clear
+ $poe_kernel->yield('foo');
+}
+
+sub foo {
+ $_[OBJECT]->_clear_registrations();
+ $poe_kernel->yield('_dispatch', 'foo', 42);
+ $poe_kernel->alias_remove('source');
+}
+
+sub new {
+ return $_[0]->SUPER::new(prefix => 'foo_');
+}
+
+my $ok = 1;
+
+POE::Session->create(
+ inline_states => {
+ _start => sub {
+ main->new();
+ $poe_kernel->post('source', 'register', 'all');
+ },
+ foo_foo => sub {
+ $ok = 0;
+ },
+ }
+);
+
+POE::Kernel->run();
+
+ok($ok, '$self->_clear_registrations()');