Author: dylan
Date: 2005-05-21 02:37:37 -0400 (Sat, 21 May 2005)
New Revision: 691

Added:
   trunk/misc/poe-wheel-square/
   trunk/misc/poe-wheel-square/Build.PL
   trunk/misc/poe-wheel-square/COPYING
   trunk/misc/poe-wheel-square/MANIFEST.SKIP
   trunk/misc/poe-wheel-square/lib/
   trunk/misc/poe-wheel-square/lib/POE/
   trunk/misc/poe-wheel-square/lib/POE/Wheel/
   trunk/misc/poe-wheel-square/lib/POE/Wheel/Square.pm
   trunk/misc/poe-wheel-square/lib/POE/Wheel/Square/
   trunk/misc/poe-wheel-square/lib/POE/Wheel/Square/Loader.pm
   trunk/misc/poe-wheel-square/t/
   trunk/misc/poe-wheel-square/t/001_plugin.t
   trunk/misc/poe-wheel-square/t/002_loader.t
   trunk/misc/poe-wheel-square/t/003_run.t
Removed:
   trunk/misc/poe-session-plugin/
Modified:
   trunk/
Log:
 [EMAIL PROTECTED]:  dylan | 2005-05-21 02:34:46 -0400
 The birth of the square wheel!



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:973
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:11166
1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk-merge-10131:11178
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
e9404bb1-7af0-0310-a7ff-e22194cd388b:/haver/local:974
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Added: trunk/misc/poe-wheel-square/Build.PL
===================================================================
--- trunk/misc/poe-wheel-square/Build.PL        2005-05-21 06:37:34 UTC (rev 
690)
+++ trunk/misc/poe-wheel-square/Build.PL        2005-05-21 06:37:37 UTC (rev 
691)
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+require 5.008;
+use Module::Build;
+my $build = Module::Build->new(
+       module_name        => 'POE::Wheel::Square',
+       dist_version_from  => 'lib/POE/Wheel/Square.pm',
+       dist_author        => 'Dylan William Hardison <[EMAIL PROTECTED]>',
+       dist_abstract      => 'A POE::Wheel that does things for you, and does 
not do drugs',
+       license            => 'gpl',
+       requires           => {
+               'perl'            => '5.8.0',
+               POE               => 0.27,
+       },
+       build_requires     => {
+               'Test::More'   => 0,
+       }
+       create_makefile_pl => 'passthrough',
+);
+$build->create_build_script();


Property changes on: trunk/misc/poe-wheel-square/Build.PL
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/misc/poe-wheel-square/COPYING
===================================================================
--- trunk/misc/poe-wheel-square/COPYING 2005-05-21 06:37:34 UTC (rev 690)
+++ trunk/misc/poe-wheel-square/COPYING 2005-05-21 06:37:37 UTC (rev 691)
@@ -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-wheel-square/MANIFEST.SKIP
===================================================================
--- trunk/misc/poe-wheel-square/MANIFEST.SKIP   2005-05-21 06:37:34 UTC (rev 
690)
+++ trunk/misc/poe-wheel-square/MANIFEST.SKIP   2005-05-21 06:37:37 UTC (rev 
691)
@@ -0,0 +1,11 @@
+\.old$
+\.bak
+store
+blib
+_build
+^Build$
+^\.#
+\.svn
+\.tar\.gz$
+^data
+^conf

Added: trunk/misc/poe-wheel-square/lib/POE/Wheel/Square/Loader.pm
===================================================================
--- trunk/misc/poe-wheel-square/lib/POE/Wheel/Square/Loader.pm  2005-05-21 
06:37:34 UTC (rev 690)
+++ trunk/misc/poe-wheel-square/lib/POE/Wheel/Square/Loader.pm  2005-05-21 
06:37:37 UTC (rev 691)
@@ -0,0 +1,145 @@
+# vim: set ts=4 sw=4 noexpandtab si ai sta tw=100:
+# This module is copyrighted, see end of file for details.
+package POE::Session::Plugin::Loader;
+use strict;
+use warnings;
+use Carp;
+
+our $VERSION = '0.04';
+
+sub new {
+       my $class = shift;
+       my $self = {
+               plugins => {},
+       };
+       bless $self, $class;
+}
+
+sub load_plugin {
+       my ($self, $class, @args) = @_;
+
+       if (exists $self->{plugins}{$class}) {
+               croak "Plugin $class already loaded!";
+       }
+       
+       my $object = $class->new(@args);
+       $object->load;
+       $self->{plugins}{$class} = $object;
+}
+
+sub unload_plugin {
+       my ($self, $class) = @_;
+       my $object = delete $self->{plugins}{$class};
+       $object->unload;
+}
+
+sub plugins {
+       my $self = shift;
+       keys %{ $self->{plugins} };
+}
+
+sub unload_all_plugins {
+       my ($self) = @_;
+       map { $self->unload($_) } $self->plugins
+}
+
+sub fetch_plugin {
+       my ($self, $class) = @_;
+       
+       if (exists $self->{plugins}{$class}) {
+               $self->{plugins}{$class};
+       } else {
+               undef;
+       }
+}
+
+
+1;
+__END__
+=head1 NAME
+
+POE::Session::Plugin::Loader - description
+
+=head1 SYNOPSIS
+
+  use POE::Session::Plugin::Loader;
+  use MyPlugin;
+
+  # ... In some POE state ...
+  my $loader = POE::Session::Plugin::Loader;
+  $loader->load_plugin('MyPlugin', 'some', 'args');
+  $_[HEAP]{loader} = $loader;
+
+=head1 DESCRIPTION
+
+This object maintains a list of plugin objects which have states loaded into a 
session.
+
+FIXME: Write a better description.
+
+=head1 METHODS
+
+This class implements the following methods:
+
+=head2 new(Z<>)
+
+This returns a new POE::Session::Plugin::Loader object.
+
+=head2 load_plugin($class, @args)
+
+Creates a new object of class $class, passing @args to its new() class method.
+The newly created object will have its load() method called, which should load 
states into the
+currently active L<POE::Session>.
+
+For details on defining plugins, see L<POE::Session::Plugin>.
+
+=head2 unload_plugin($class)
+
+Call unload() on the object associated with $class,
+and then destroy the said object.
+
+=head2 plugins(Z<>)
+
+Returns a list of the currently loaded class names.
+
+=head2 fetch_plugin($class)
+
+Returns the plugin object of type $class.
+Returns undef if $class was never loaded.
+
+=head2 unload_all_plugins(Z<>)
+
+Unload all currently loaded plugins.
+
+This is called when the plugin loader is DESTROY()'d, so you never really need 
to call it.
+
+=head1 BUGS
+
+None known. Bug reports are welcome. Please use our bug tracker at
+L<http://gna.org/bugs/?func=additem&group=haver>.
+
+=head1 AUTHOR
+
+Dylan William Hardison, E<lt>[EMAIL PROTECTED]<gt>
+
+=head1 SEE ALSO
+
+L<http://www.haverdev.org/>, L<POE>, L<POE::Session>, L<POE::NFA>.
+
+=head1 COPYRIGHT and LICENSE
+
+Copyright (C) 2005 by Dylan William Hardison. All Rights Reserved.
+
+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
+

Added: trunk/misc/poe-wheel-square/lib/POE/Wheel/Square.pm
===================================================================
--- trunk/misc/poe-wheel-square/lib/POE/Wheel/Square.pm 2005-05-21 06:37:34 UTC 
(rev 690)
+++ trunk/misc/poe-wheel-square/lib/POE/Wheel/Square.pm 2005-05-21 06:37:37 UTC 
(rev 691)
@@ -0,0 +1,230 @@
+# vim: set ts=4 sw=4 noexpandtab si ai sta tw=100:
+# This module is copyrighted, see end of file for details.
+package POE::Session::Plugin;
+use strict;
+use warnings;
+use Carp;
+use POE::Wheel;
+our $VERSION = '0.06';
+our $Kernel  = $POE::Kernel::poe_kernel;
+
+sub new {
+       my $class = shift;
+       my $self = {
+               # I only prefix these with underscores because I am paranoid of
+               # subclasses clobbering them. :)
+               _provided_states => [],
+               _defined_states  => { },
+               _id              => POE::Wheel::allocate_wheel_id(),
+       };
+       bless $self, $class;
+       $self->provide("load_$self->{_id}", 'on_load');
+       $self->provide("unload_$self->{_id}", 'on_unload');
+       $self->setup(@_);
+       return $self;
+}
+
+sub setup {  }
+
+# POE state called when we load.
+sub on_load {
+       
+}
+
+# POE state called when we unload.
+sub on_unload {
+       
+}
+
+
+# This method is not really public. :)
+sub kernel {
+       my ($self, $kernel) = @_;
+       $Kernel = $kernel;
+}
+
+sub provide {
+       my ($self, $state, $method) = @_;
+       push @{ $self->{_provided_states} }, [ $state, $method ];
+}
+
+sub provided_states {
+       my $self = shift;
+       @{ $self->{_provided_states} };
+}
+
+sub defined_states {
+       my $self = shift;
+       keys %{ $self->{_defined_states} };
+}
+
+
+sub invoke {
+       my $self = shift;
+       my $act  = shift;
+       my $session = $Kernel->get_active_session();
+       my $class   = ref $self;
+       $Kernel->call($session, join('_', $act, $self->ID));
+}
+
+sub ID { shift->{_id} }
+
+# Load all provided states.
+sub load {
+       my $self = shift;
+       map {
+               $self->define(@$_)
+       } $self->provided_states;
+       $self->invoke('load');
+}
+
+# Unload all *defined* states.
+sub unload {
+       my $self = shift;
+       $self->invoke('unload');
+       map {
+               $self->undefine($_)
+       } $self->defined_states;
+}
+
+sub define {
+       my ($self, $state, $method) = @_;
+       $method ||= $state;
+
+       croak "State $state defined; can't redefine"
+               if exists $self->{_defined_states}{$state};
+       $self->{_defined_states}{$state} = $method;
+       $Kernel->state($state, 
+               $self->{package} ? ref $self : $self,
+               $method
+       );
+}
+
+sub undefine {
+       my ($self, $state) = @_;
+
+       croak "State $state not defined; can't undefine"
+               unless exists $self->{_defined_states}{$state};
+       delete $self->{_defined_states}{$state};
+       $Kernel->state($state);
+}
+
+
+sub DESTROY {
+       my $self = shift;
+       POE::Wheel::free_wheel_id($self->ID);
+}
+
+1;
+
+__END__
+=head1 NAME
+
+POE::Session::Plugin - Base class for modules that extend POE::Session at 
runtime.
+
+=head1 SYNOPSIS
+
+       package MyPlugin;
+       use POE;
+       use base 'POE::Session::Plugin';
+
+       sub setup {
+               my $self = shift;
+               $self->provide('foo', 'on_foo');
+       }
+
+       sub on_foo {
+               my ($kernel, $heap, $self) = @_[KERNEL, HEAP, OBJECT];
+               # ...
+       }
+
+=head1 DESCRIPTION
+
+This module allows the loading and unloading of object states into a running 
L<POE::Session>.
+
+Plugins are not unlike a L<POE::Wheel>, except instead of producing events, 
they respond to them.
+
+This behavior is similar to that of L<POE::NFA>, except it is added to 
existing L<POE::Session>
+sessions.
+
+=head1 METHODS
+
+This class implements the following methods:
+
+=head2 new(@args)
+
+This returns a new plugin object.
+Its arguments (@args) are passed to setup()
+
+=head2 setup()
+
+B<Do not call this method>. It is called by new().
+
+Subclasses should overload this method and use it call provide()
+to specify which states they define in the current session.
+
+=head2 define($state [, $method ])
+
+Bind $state in the currently active session to the method $method of $self.
+If $method is omitted, it defaults to the same name as $state.
+
+=head2 undefine($state)
+
+Remove the binding of $state in the current session, if and only if it was 
previously
+defined by our $self.
+
+=head2 provide($state [, $method ])
+
+This is like a delayed define(). It will only occurs when load() is called.
+
+=head2 load(Z<>)
+
+Load all C<provide>'d states.
+
+=head2 unload(Z<>)
+
+This undefines (with undefine()) all states that were defined with define()
+or provided() and subsequently loaded with load().
+
+=head2 on_load
+
+This is method is called as a POE state when the plugin is loaded.
+$_[KERNEL], $_[SESSION], etc, should all be correct.
+
+=head2 on_unload
+
+This is method is called as a POE state when the plugin is unloaded.
+$_[KERNEL], $_[SESSION], etc, should all be correct.
+
+=head1 BUGS
+
+None known. Bug reports are welcome. Please use our bug tracker at
+L<http://gna.org/bugs/?func=additem&group=haver>.
+
+=head1 AUTHOR
+
+Dylan William Hardison, E<lt>[EMAIL PROTECTED]<gt>
+
+=head1 SEE ALSO
+
+L<http://www.haverdev.org/>, L<POE::Session::Plugin::Loader>,
+L<POE>, L<POE::Session>, L<POE::NFA>.
+
+=head1 COPYRIGHT and LICENSE
+
+Copyright (C) 2005 by Dylan William Hardison. All Rights Reserved.
+
+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
+

Added: trunk/misc/poe-wheel-square/t/001_plugin.t
===================================================================
--- trunk/misc/poe-wheel-square/t/001_plugin.t  2005-05-21 06:37:34 UTC (rev 
690)
+++ trunk/misc/poe-wheel-square/t/001_plugin.t  2005-05-21 06:37:37 UTC (rev 
691)
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+# vim: set ft=perl:
+use strict;
+use Test::More tests => 4;
+
+my $class = 'POE::Session::Plugin';
+use_ok($class);
+can_ok($class, 'new');
+
+my $plugin = $class->new;
+
+isa_ok($plugin, $class);
+can_ok($plugin,
+       qw(
+               provide
+               load
+               unload
+               define
+               undefine
+               provided_states
+               defined_states
+               setup
+               kernel
+       )
+);

Added: trunk/misc/poe-wheel-square/t/002_loader.t
===================================================================
--- trunk/misc/poe-wheel-square/t/002_loader.t  2005-05-21 06:37:34 UTC (rev 
690)
+++ trunk/misc/poe-wheel-square/t/002_loader.t  2005-05-21 06:37:37 UTC (rev 
691)
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+# vim: set ft=perl:
+use strict;
+use Test::More tests => 4;
+
+my $class = 'POE::Session::Plugin::Loader';
+require_ok($class);
+can_ok($class, 'new');
+
+my $loader = $class->new;
+isa_ok($loader, $class);
+can_ok($loader,
+       qw(
+               load_plugin
+               unload_plugin
+               plugins
+               fetch_plugin
+               unload_all_plugins
+       )
+);

Added: trunk/misc/poe-wheel-square/t/003_run.t
===================================================================
--- trunk/misc/poe-wheel-square/t/003_run.t     2005-05-21 06:37:34 UTC (rev 
690)
+++ trunk/misc/poe-wheel-square/t/003_run.t     2005-05-21 06:37:37 UTC (rev 
691)
@@ -0,0 +1,95 @@
+#!/usr/bin/perl
+# vim: set ft=perl:
+use strict;
+use Test::More tests => 7;
+use POE;
+use POE::Session::Plugin;
+use POE::Session::Plugin::Loader;
+
+BEGIN {
+       package MyPlugin;
+       use POE;
+       use base 'POE::Session::Plugin';
+
+       sub setup {
+               my $self = shift;
+               $self->provide('foo', 'on_foo');
+               $self->provide('bar', 'on_bar');
+               $self->provide('baz', 'on_baz');
+       }
+
+       sub on_load {
+               my $self = $_[OBJECT];
+               $self->{load} = 1;
+       }
+
+       sub on_unload {
+               my $self = $_[OBJECT];
+               $self->{unload} = 1;
+       }
+       sub on_foo { 
+               my $self = $_[OBJECT];
+               $self->{foo}++;
+       }
+       
+       sub on_bar { 
+               my $self = $_[OBJECT];
+               $self->{bar}++;
+       }
+
+       sub on_baz {
+               my $self = $_[OBJECT];
+               $self->{baz}++;
+               if ($self->{baz} == 1) {
+                       $_[KERNEL]->yield('bye');
+               }
+       }
+}
+
+POE::Session->create(
+       inline_states => {
+               _start => \&on_start,
+               _stop  => \&on_stop,
+               bye    => \&on_bye,
+       },
+);
+
+POE::Kernel->run;
+
+sub on_start {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+       my $loader = new POE::Session::Plugin::Loader;
+       $loader->load_plugin('MyPlugin');
+       $heap->{loader} = $loader;
+
+       diag "Starting session";
+       foreach my $state (qw( foo bar baz )) {
+               $kernel->yield($state) for 1 .. 3;
+       }
+}
+
+sub on_stop {
+       diag "Stopping session";
+}
+
+sub on_bye {
+       my ($kernel, $heap) = @_[KERNEL, HEAP];
+       my $loader = $heap->{loader};
+       my $p = $loader->fetch_plugin('MyPlugin');
+       
+       diag "Saying goodbye";
+       is($p->{foo}, 3, "Called foo 3 times");
+       is($p->{bar}, 3, "Called bar 3 times");
+       is($p->{baz}, 3, "Called baz 3 times");
+       
+       diag "Calling foo again";
+       $kernel->call($_[SESSION], 'foo');
+       is($p->{foo}, 4, "foo is now 4");
+       
+       diag "Unloading MyPlugin";
+       $loader->unload_plugin('MyPlugin');
+       $kernel->call($_[SESSION], 'foo');
+       isnt($p->{foo}, 5, "foo is not 5");
+       ok($p->{load}, "on_load was called.");
+       ok($p->{unload}, "on_unload was called.");
+}


Reply via email to