cvsuser     01/11/30 08:00:53

  Modified:    P5EEx/Blue/P5EEx/Blue Config.pod Context.pm Exceptions.pm
                        Log.pm Messaging.pm P5EE.pm Repository.pm
                        Security.pm Serializer.pm Service.pm Templates.pm
                        Widget.pm datetime.pod perlstyle.pod podstyle.pod
               P5EEx/Blue/htdocs/api perldocs.css
               P5EEx/Blue/sbin perldocs
  Added:       P5EEx/Blue/P5EEx/Blue Procedure.pm Session.pm
  Removed:     P5EEx/Blue/P5EEx/Blue Component.pm
  Log:
  Renamed 'Component' to 'Service' throughout. Improved perldocs.
  
  Revision  Changes    Path
  1.3       +27 -27    p5ee/P5EEx/Blue/P5EEx/Blue/Config.pod
  
  Index: Config.pod
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Config.pod,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- Config.pod        2001/11/22 05:16:59     1.2
  +++ Config.pod        2001/11/30 16:00:52     1.3
  @@ -1,6 +1,6 @@
   
   ######################################################################
  -## $Id: Config.pod,v 1.2 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Config.pod,v 1.3 2001/11/30 16:00:52 spadkins Exp $
   ######################################################################
   
   =head1 NAME
  @@ -25,14 +25,14 @@
      $config->overlay($config1, $config2);  # merge $config2 onto $config1
      $config->graft($branch_name, $config2);  # graft new config structure onto branch
   
  -   # By convention, the configurations for each P5EE component will be located
  +   # By convention, the configurations for each P5EE service will be located
      # two levels under the hash ref as shown.
   
  -   $config->{Config}            # config settings for all Config components
  -   $config->{Config}{default}   # config settings for the default Config component
  -   $config->{Security}          # config settings for all Security components
  -   $config->{Security}{default} # config settings for the default Security component
  -   $config->{Templates}{tt}     # config settings for the Templates component named 
"tt"
  +   $config->{Config}            # config settings for all Config services
  +   $config->{Config}{default}   # config settings for the default Config service
  +   $config->{Security}          # config settings for all Security services
  +   $config->{Security}{default} # config settings for the default Security service
  +   $config->{Templates}{tt}     # config settings for the Templates service named 
"tt"
   
      # The default driver (if "configClass" not supplied) reads in a Perl
      # data structure from the file.  Alternate drivers can read a Storable,
  @@ -91,9 +91,9 @@
   
   =over
   
  -=item * L<C<P5EEx::Blue::Config>|"Class: P5EEx::Blue::Config">
  +=item * Class: L<C<P5EEx::Blue::Config>|"Class: P5EEx::Blue::Config">
   
  -=item * L<C<P5EEx::Blue::Config::File>|P5EEx::Blue::Config::File>
  +=item * Class: L<C<P5EEx::Blue::Config::File>|P5EEx::Blue::Config::File>
   
   Uses any one of Serializers to deserialize the file data to the
   config data structure.
  @@ -170,10 +170,10 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   This constructor is used to create all Config objects.
   Customized behavior for a particular type of Config
  @@ -193,8 +193,8 @@
       $config = $context->config();
   
       (internally only)
  -    $component = P5EEx::Blue::Config->new();
  -    $component = P5EEx::Blue::Config->new(
  +    $config = P5EEx::Blue::Config->new();
  +    $config = P5EEx::Blue::Config->new(
           arg1 => 'value1',
           arg2 => 'value2',
       );
  @@ -210,10 +210,10 @@
   =cut
   
   #############################################################################
  -# Method: get()
  +# get()
   #############################################################################
   
  -=head2 Method: get()
  +=head2 get()
   
       * Signature: $property_value = $config->get($property_name);
       * Param:     $property_name    string
  @@ -230,10 +230,10 @@
   =cut
   
   #############################################################################
  -# Method: get_branch()
  +# get_branch()
   #############################################################################
   
  -=head2 Method: get_branch()
  +=head2 get_branch()
   
       * Signature: $branch = $config->get_branch($branch_name);
       * Param:     $branch_name  string
  @@ -257,10 +257,10 @@
   =cut
   
   #############################################################################
  -# Method: dump()
  +# dump()
   #############################################################################
   
  -=head2 Method: dump()
  +=head2 dump()
   
       * Signature: $perl = $config->dump();
       * Param:     void
  @@ -287,10 +287,10 @@
   =cut
   
   #############################################################################
  -# Method: init()
  +# init()
   #############################################################################
   
  -=head2 Method: init()
  +=head2 init()
   
   The init() method is called from within the standard Config constructor.
   The init() method in this class does nothing.
  @@ -310,10 +310,10 @@
   =cut
   
   #############################################################################
  -# Method: load()
  +# load()
   #############################################################################
   
  -=head2 Method: load()
  +=head2 load()
   
       * Signature: $config_data = $config->load($named);
       * Param:     void
  @@ -342,10 +342,10 @@
   =cut
   
   #############################################################################
  -# Method: overlay()
  +# overlay()
   #############################################################################
   
  -=head2 Method: overlay()
  +=head2 overlay()
   
       * Signature: $config->overlay($config2);
       * Signature: $config->overlay($config1, $config2);
  @@ -366,10 +366,10 @@
   =cut
   
   #############################################################################
  -# Method: graft()
  +# graft()
   #############################################################################
   
  -=head2 Method: graft()
  +=head2 graft()
   
       * Signature: $config->graft($branch_name, $config2);
       * Param:     $branch_name   string
  
  
  
  1.4       +51 -25    p5ee/P5EEx/Blue/P5EEx/Blue/Context.pm
  
  Index: Context.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Context.pm,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -r1.3 -r1.4
  --- Context.pm        2001/11/22 05:16:59     1.3
  +++ Context.pm        2001/11/30 16:00:52     1.4
  @@ -1,6 +1,6 @@
   
   #############################################################################
  -## $Id: Context.pm,v 1.3 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Context.pm,v 1.4 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Context;
  @@ -39,20 +39,8 @@
   =head1 DESCRIPTION
   
   A Context class models the environment (aka "context)
  -in which the current process is
  -running. Examples might be
  +in which the current process is running.
   
  -    P5EEx::Blue::Context::CGI
  -    P5EEx::Blue::Context::FCGI
  -    P5EEx::Blue::Context::ModPerl
  -    P5EEx::Blue::Context::ModPerlRegistry
  -    P5EEx::Blue::Context::PPerl
  -    P5EEx::Blue::Context::Cmd
  -    P5EEx::Blue::Context::Daemon
  -    P5EEx::Blue::Context::POE
  -    P5EEx::Blue::Context::Gtk
  -    P5EEx::Blue::Context::WxPerl
  -
   The role of the Context class is to abstract the details of the
   various runtime environments (or Platforms) (including their event loops)
   so that the basic programming model for the developer is uniform.
  @@ -79,6 +67,44 @@
   =cut
   
   #############################################################################
  +# CLASS GROUP
  +#############################################################################
  +
  +=head1 Class Group: Context
  +
  +The following classes might be a part of the Context Class Group.
  +
  +=over
  +
  +=item * Class: P5EEx::Blue::Context
  +
  +=item * Class: P5EEx::Blue::Context::CGI
  +
  +=item * Class: P5EEx::Blue::Context::FCGI
  +
  +=item * Class: P5EEx::Blue::Context::ModPerl
  +
  +=item * Class: P5EEx::Blue::Context::ModPerlRegistry
  +
  +=item * Class: P5EEx::Blue::Context::PPerl
  +
  +=item * Class: P5EEx::Blue::Context::Cmd
  +
  +=item * Class: P5EEx::Blue::Context::Daemon
  +
  +=item * Class: P5EEx::Blue::Context::POE
  +
  +=item * Class: P5EEx::Blue::Context::SOAP (when acting as a SOAP server)
  +
  +=item * Class: P5EEx::Blue::Context::Gtk
  +
  +=item * Class: P5EEx::Blue::Context::WxPerl
  +
  +=back
  +
  +=cut
  +
  +#############################################################################
   # ATTRIBUTES/CONSTANTS/CLASS VARIABLES/GLOBAL VARIABLES
   #############################################################################
   
  @@ -101,10 +127,10 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The P5EEx::Blue::Context->new() method is rarely called directly.
   That is because a $context should always be instantiated by calling
  @@ -183,10 +209,10 @@
   =cut
   
   #############################################################################
  -# Method: init()
  +# init()
   #############################################################################
   
  -=head2 Method: init()
  +=head2 init()
   
   The init() method is called from within the standard Context constructor.
   The init() method in this class does nothing.
  @@ -221,7 +247,7 @@
   # log()
   #############################################################################
   
  -=head2 Method: log()
  +=head2 log()
   
   The log() method writes a string (the concatenated list of @args) to
   a log file.
  @@ -247,7 +273,7 @@
   # user()
   #############################################################################
   
  -=head2 Method: user()
  +=head2 user()
   
   The user() method returns the username of the authenticated user.
   The special name, "guest", refers to the unauthenticated (anonymous) user.
  @@ -273,7 +299,7 @@
   # config()
   #############################################################################
   
  -=head2 Method: config()
  +=head2 config()
   
   The config() method returns the global configuration structure.
   
  @@ -306,7 +332,7 @@
   # dbg()
   #############################################################################
   
  -=head2 Method: dbg()
  +=head2 dbg()
   
   The dbg() method is used to check whether a given line of debug output
   should be generated.  
  @@ -358,7 +384,7 @@
   # dbgprint()
   #############################################################################
   
  -=head2 Method: dbgprint()
  +=head2 dbgprint()
   
   The dbgprint() method is used to produce debug output.
   The output goes to an output stream which is appropriate for
  @@ -387,7 +413,7 @@
   # dbglevel()
   #############################################################################
   
  -=head2 Method: dbglevel()
  +=head2 dbglevel()
   
   The dbglevel() method is used to set the debug level.
   Setting the dbglevel to 0 turns off debugging output and is suitable
  @@ -419,7 +445,7 @@
   # dbgscope()
   #############################################################################
   
  -=head2 Method: dbgscope()
  +=head2 dbgscope()
   
   The dbgscope() method is used to get the hash which determines which
   debug statements are to be printed out when the debug level is set to a
  
  
  
  1.2       +5 -5      p5ee/P5EEx/Blue/P5EEx/Blue/Exceptions.pm
  
  Index: Exceptions.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Exceptions.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Exceptions.pm     2001/11/22 05:16:59     1.1
  +++ Exceptions.pm     2001/11/30 16:00:52     1.2
  @@ -8,7 +8,7 @@
   use strict;
   use vars qw($VERSION);
   
  -$VERSION = sprintf '%2d.%02d', q$Revision: 1.1 $ =~ /(\d+)\.(\d+)/;
  +$VERSION = sprintf '%2d.%02d', q$Revision: 1.2 $ =~ /(\d+)\.(\d+)/;
   
   my %e;
   
  @@ -67,12 +67,12 @@
   how this is done.
   
   Note that there is really only one general
  -exception class defined for each P5EE Component. 
  -Within each Component, there may be a separate
  +exception class defined for each P5EE Service. 
  +Within each Service, there may be a separate
   exception hierarchy which is more fine-grained.  However, each
  -component is responsible to (1) handle these exceptions,
  +service is responsible to (1) handle these exceptions,
   (2) handle these exceptions and rethrow
  -the general exception defined for the component, or
  +the general exception defined for the service, or
   (3) derive all of the exceptions from the general exception.
   
   =head1 EXCEPTION CLASSES
  
  
  
  1.2       +12 -12    p5ee/P5EEx/Blue/P5EEx/Blue/Log.pm
  
  Index: Log.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Log.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Log.pm    2001/11/22 05:16:59     1.1
  +++ Log.pm    2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Log.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Log.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Log;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,12 +19,12 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $log = $context->component("Log");  # or ...
  +    $log = $context->service("Log");  # or ...
       $log = $context->log();
   
   =head1 DESCRIPTION
   
  -A Log component is a means by which messages are logged through a
  +A Log service is a means by which messages are logged through a
   logging system.  This perhaps ends up in a file, or perhaps it
   ends up on someone's operator console screen somewhere.
   
  @@ -78,13 +78,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -97,10 +97,10 @@
   =cut
   
   #############################################################################
  -# Method: log()
  +# log()
   #############################################################################
   
  -=head2 Method: log()
  +=head2 log()
   
       * Signature: $log->log(@text);
       * Param:     @text              array[string]
  @@ -111,7 +111,7 @@
       Sample Usage: 
   
       $context = P5EEx::Blue::P5EE->context();
  -    $log = $context->component("Log");  # or ...
  +    $log = $context->service("Log");  # or ...
       $log->log("Error occurred");
   
   =cut
  @@ -129,7 +129,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.2       +15 -15    p5ee/P5EEx/Blue/P5EEx/Blue/Messaging.pm
  
  Index: Messaging.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Messaging.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Messaging.pm      2001/11/22 05:16:59     1.1
  +++ Messaging.pm      2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Messaging.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Messaging.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Messaging;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,7 +19,7 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $messaging = $context->component("Messaging");  # or ...
  +    $messaging = $context->service("Messaging");  # or ...
       $messaging = $context->messaging();
   
       ($status, $ticket) = $messaging->send(
  @@ -39,11 +39,11 @@
   
   =head1 DESCRIPTION
   
  -A Messaging component is a means by which data can be sent asynchronously
  +A Messaging service is a means by which data can be sent asynchronously
   (or synchronously) to a recipient and responses can be received.
   
   Because the possibility exists for the messaging channel to be asynchronous,
  -code that uses a Messaging component must code for the most complicated case
  +code that uses a Messaging service must code for the most complicated case
   (asynchronous).
   
   =cut
  @@ -80,7 +80,7 @@
   
   =head1 Class: P5EEx::Blue::Messaging
   
  -A Messaging component is a means by which data can be sent synchronously
  +A Messaging service is a means by which data can be sent synchronously
   or asynchronously to a recipient and responses can be received.
   
    * Throws: P5EEx::Blue::Exception::Messaging
  @@ -101,13 +101,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -120,10 +120,10 @@
   =cut
   
   #############################################################################
  -# Method: send()
  +# send()
   #############################################################################
   
  -=head2 Method: send()
  +=head2 send()
   
       * Signature: ($status, $ticket) = $messaging->send(%named);
       * Param:     recipient          string
  @@ -150,10 +150,10 @@
   }
   
   #############################################################################
  -# Method: receive()
  +# receive()
   #############################################################################
   
  -=head2 Method: receive()
  +=head2 receive()
   
       * Signature: $message = $messaging->receive();
       * Signature: $message = $messaging->receive(%named);
  @@ -193,7 +193,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.4       +26 -21    p5ee/P5EEx/Blue/P5EEx/Blue/P5EE.pm
  
  Index: P5EE.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/P5EE.pm,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -r1.3 -r1.4
  --- P5EE.pm   2001/11/22 05:16:59     1.3
  +++ P5EE.pm   2001/11/30 16:00:52     1.4
  @@ -1,6 +1,6 @@
   
   #############################################################################
  -## $Id: P5EE.pm,v 1.3 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: P5EE.pm,v 1.4 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::P5EE;
  @@ -57,7 +57,7 @@
   
       * Version: 0.01
   
  -=head2 Requirements
  +=head2 Distribution Requirements
   
   The following are enumerated requirements for the P5EE distribution.
   It forms a high-level feature list. 
  @@ -69,12 +69,12 @@
           http://www.officevision.com/pub/p5ee/definitions.html
       o a Software Architecture supporting many Platforms
           http://www.officevision.com/pub/p5ee/platforms.html
  -    o a pluggable interface/implementation component architecture
  +    o a pluggable interface/implementation service architecture
       o support developers who wish to use portions of the P5EE
           without giving up their other styles of programming
           (and support gradual migration)
   
  -=head2 Design
  +=head2 Distribution Design
   
   The distribution is designed in such a way that most of the functionality
   is actually provided by modules outside the P5EEx::Blue namespace.
  @@ -82,7 +82,7 @@
   The goal of the P5EE is to bring together many technologies to make a
   unified whole.  In essence, it is collecting and unifying the good work
   of a multitude of excellent projects which have already been developed.
  -This results in a Pluggable Component design which allows just about
  +This results in a Pluggable Service design which allows just about
   everything in P5EE to be customized.  These Class Groups are described
   in detail below.
   
  @@ -98,7 +98,7 @@
   =head2 Class Groups
   
   The major Class Groups in the P5EE distribution fall into three categories:
  -Core, Core Components, and Components.
  +Core, Core Services, and Services.
   
   =over
   
  @@ -113,11 +113,14 @@
   =item * Class Group: L<C<Serializer>|P5EEx::Blue::Serializer>
         - transforms a perl struct to a scalar and back
   
  +=item * Class Group: L<C<Session>|P5EEx::Blue::Session>
  +      - represents the state associated with a sequence of multiple events
  +
   =item * Class Group: L<C<Templates>|P5EEx::Blue::Templates>
         - encapsulates template system details
   
  -=item * Class Group: L<C<Service>|P5EEx::Blue::Service>
  -      - like Java Servlet with $request/$response
  +=item * Class Group: L<C<Procedure>|P5EEx::Blue::Procedure>
  +      - a (potentially remote) procedure which may be executed
   
   =item * Class Group: L<C<Messaging>|P5EEx::Blue::Messaging>
         - a message queue with configurable quality of service
  @@ -132,7 +135,7 @@
         - provides authentication and authorization
   
   =item * Class Group: L<C<Log>|P5EEx::Blue::Log>
  -      - a logging component
  +      - a logging service
   
   =back
   
  @@ -147,14 +150,16 @@
   The Core Class Group contains the following classes.
   
   =over
  +
  +=item * Class: L<C<P5EEx::Blue::P5EE>|"Class: P5EEx::Blue::P5EE">
   
  -=item * L<C<P5EEx::Blue::P5EE>|"Class: P5EEx::Blue::P5EE">
  +=item * Class: L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
  -=item * L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +=item * Document: L<C<Perlstyle, Perl Style Guide>|P5EEx::Blue::perlstyle>
   
  -=item * L<C<P5EEx::Blue::perlstyle>|P5EEx::Blue::perlstyle>
  +=item * Document: L<C<Podstyle, POD Documentation Guide>|P5EEx::Blue::podstyle>
   
  -=item * L<C<P5EEx::Blue::podstyle>|P5EEx::Blue::podstyle>
  +=item * Document: L<C<Datetime, Dates and Times in P5EE>|P5EEx::Blue::datetime>
   
   =back
   
  @@ -191,9 +196,9 @@
   
   =over
   
  -=item * Capability: Component Factory
  +=item * Capability: Service Factory
   
  -This package allows you to construct objects (components) that
  +This package allows you to construct objects (services) that
   you do not know
   the classes for at development time.  These classes are specified
   through the configuration and are produced using this package as
  @@ -212,10 +217,10 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The P5EEx::Blue::P5EE->new() method is not a constructor for
   a P5EEx::Blue::P5EE class.  However, it is a constructor, returning
  @@ -267,10 +272,10 @@
   }
   
   #############################################################################
  -# Method: context()
  +# context()
   #############################################################################
   
  -=head2 Method: context()
  +=head2 context()
   
       * Signature: $context = P5EEx::Blue::P5EE->context()
       * Param:     contextClass class  [in]
  @@ -347,10 +352,10 @@
   }
   
   #############################################################################
  -# Method: config()
  +# config()
   #############################################################################
   
  -=head2 Method: config()
  +=head2 config()
   
       * Signature: $config = P5EEx::Blue::P5EE->config(%named);
       * Param:     configClass  class  [in]
  
  
  
  1.2       +10 -10    p5ee/P5EEx/Blue/P5EEx/Blue/Repository.pm
  
  Index: Repository.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Repository.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Repository.pm     2001/11/22 05:16:59     1.1
  +++ Repository.pm     2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Repository.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Repository.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Repository;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,7 +19,7 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $repository = $context->component("Repository");  # or ...
  +    $repository = $context->service("Repository");  # or ...
       $repository = $context->repository();
   
       ... TBD ...
  @@ -88,13 +88,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -107,10 +107,10 @@
   =cut
   
   #############################################################################
  -# Method: TBD()
  +# TBD()
   #############################################################################
   
  -=head2 Method: TBD()
  +=head2 TBD()
   
       * Signature: $tbd_return = $repository->tbd($tbd_param);
       * Param:     $tbd_param         integer
  @@ -136,7 +136,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.2       +12 -12    p5ee/P5EEx/Blue/P5EEx/Blue/Security.pm
  
  Index: Security.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Security.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Security.pm       2001/11/22 05:16:59     1.1
  +++ Security.pm       2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Security.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Security.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Security;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,14 +19,14 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $security = $context->component("Security");  # or ...
  +    $security = $context->service("Security");  # or ...
       $security = $context->security();
   
       ... TBD ...
   
   =head1 DESCRIPTION
   
  -A Security component is a means by which a user may be authenticated
  +A Security service is a means by which a user may be authenticated
   and by which he may be authorized to perform specific operations.
   
   =cut
  @@ -73,7 +73,7 @@
   
   =head1 Class: P5EEx::Blue::Security
   
  -A Security component is a means by which a user may be authenticated
  +A Security service is a means by which a user may be authenticated
   and by which he may be authorized to perform specific operations.
   
    * Throws: P5EEx::Blue::Exception::Security
  @@ -94,13 +94,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -113,10 +113,10 @@
   =cut
   
   #############################################################################
  -# Method: TBD()
  +# TBD()
   #############################################################################
   
  -=head2 Method: TBD()
  +=head2 TBD()
   
       * Signature: $tbd_return = $repository->tbd($tbd_param);
       * Param:     $tbd_param         integer
  @@ -142,7 +142,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.2       +17 -17    p5ee/P5EEx/Blue/P5EEx/Blue/Serializer.pm
  
  Index: Serializer.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Serializer.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Serializer.pm     2001/11/22 05:16:59     1.1
  +++ Serializer.pm     2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Serializer.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Serializer.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Serializer;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,7 +19,7 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $serializer = $context->component("Serializer");  # or ...
  +    $serializer = $context->service("Serializer");  # or ...
       $serializer = $context->serializer();
       $data = {
           an => 'arbitrary',
  @@ -101,13 +101,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -120,10 +120,10 @@
   =cut
   
   #############################################################################
  -# Method: serialize()
  +# serialize()
   #############################################################################
   
  -=head2 Method: serialize()
  +=head2 serialize()
   
       * Signature: $serialized_data = $serializer->serialize($data);
       * Param:     $data              ref
  @@ -134,7 +134,7 @@
       Sample Usage: 
   
       $context = P5EEx::Blue::P5EE->context();
  -    $serializer = $context->component("Serializer");  # or ...
  +    $serializer = $context->service("Serializer");  # or ...
       $serializer = $context->serializer();
       $data = {
           an => 'arbitrary',
  @@ -153,10 +153,10 @@
   }
   
   #############################################################################
  -# Method: deserialize()
  +# deserialize()
   #############################################################################
   
  -=head2 Method: deserialize()
  +=head2 deserialize()
   
       * Signature: $serialized_data = $serializer->deserialize($data);
       * Param:     $data              ref
  @@ -167,7 +167,7 @@
       Sample Usage: 
   
       $context = P5EEx::Blue::P5EE->context();
  -    $serializer = $context->component("Serializer");  # or ...
  +    $serializer = $context->service("Serializer");  # or ...
       $serializer = $context->serializer();
       $data = $serializer->deserialize($serialized_data);
       print $serializer->dump($data), "\n";
  @@ -190,10 +190,10 @@
   }
   
   #############################################################################
  -# Method: dump()
  +# dump()
   #############################################################################
   
  -=head2 Method: dump()
  +=head2 dump()
   
       * Signature: $perl = $serializer->dump($data);
       * Param:     $data      ref
  @@ -204,7 +204,7 @@
       Sample Usage: 
   
       $context = P5EEx::Blue::P5EE->context();
  -    $serializer = $context->component("Serializer");  # or ...
  +    $serializer = $context->service("Serializer");  # or ...
       $serializer = $context->serializer();
       $data = $serializer->deserialize($serialized_data);
       print $serializer->dump($data), "\n";
  @@ -228,7 +228,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.2       +78 -75    p5ee/P5EEx/Blue/P5EEx/Blue/Service.pm
  
  Index: Service.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Service.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Service.pm        2001/11/22 05:16:59     1.1
  +++ Service.pm        2001/11/30 16:00:52     1.2
  @@ -1,134 +1,136 @@
   
   #############################################################################
  -## $Id: Service.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Service.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Service;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  -
   use strict;
   
   =head1 NAME
   
  -P5EEx::Blue::Service - Interface for synchronous service invocation
  +P5EEx::Blue::Service - Provides core methods for P5EE Services
   
   =head1 SYNOPSIS
   
  -    use P5EEx::Blue::P5EE;
  +    use P5EEx::Blue::Service;
   
  -    $context = P5EEx::Blue::P5EE->context();
  -    $service = $context->component("Service");  # or ...
  -    $service = $context->service();
  -
  -    $service->perform($request, $response);
  -    $response = $service->perform($request);
  -    $response = $service->perform(%named);
  +    # never really used, because this is a base class
  +    %named = (
  +        # named args would go here
  +    );
  +    $service = P5EEx::Blue::Service->new(%named);
   
   =head1 DESCRIPTION
  +
  +The P5EEx::Blue::Service class is a base class for all P5EE services.
   
  -A Service component is a means by which a function call (perhaps remote)
  -may be made synchronously.
  +    * Throws: P5EEx::Blue::Exception
  +    * Since:  0.01
   
   =cut
   
   #############################################################################
  -# CLASS GROUP
  +# CONSTRUCTOR METHODS
   #############################################################################
  -
  -=head1 Class Group: Service
  -
  -The following classes might be a part of the Service Class Group.
  -
  -=over
  -
  -=item * Class: P5EEx::Blue::Service
  -
  -=item * Class: P5EEx::Blue::Service::Local
   
  -=item * Class: P5EEx::Blue::Service::SOAP
  -
  -=item * Class: P5EEx::Blue::Service::pRPC
  -
  -=item * Class: P5EEx::Blue::Service::PlRPC
  -
  -=item * Class: P5EEx::Blue::Service::Messaging
  -
  -=back
  +=head1 Constructor Methods:
   
   =cut
   
   #############################################################################
  -# CLASS
  +# Method: new()
   #############################################################################
   
  -=head1 Class: P5EEx::Blue::Service
  +=head2 new()
   
  -A Service component is a means by which a function call (perhaps remote)
  -may be made synchronously.
  -
  - * Throws: P5EEx::Blue::Exception::Service
  +This constructor is used to create all objects which are P5EE services.
  +Customized behavior for a particular service is achieved by overriding
  +the init() method.
  +
  +    * Signature: $service = P5EEx::Blue::Service->new(%named)
  +    * Return:    $service       P5EEx::Blue::Service
  +    * Throws:    P5EEx::Blue::Exception
    * Since:  0.01
   
  -=head2 Class Design
  +    Sample Usage: (never used because this is a base class)
   
  -...
  +    $service = P5EEx::Blue::Service->new();
  +    $service = P5EEx::Blue::Service->new(
  +        arg1 => 'value1',
  +        arg2 => 'value2',
  +    );
   
   =cut
   
  -#############################################################################
  -# CONSTRUCTOR METHODS
  -#############################################################################
  +sub new {
  +    my $this = shift;
  +    my $class = ref($this) || $this;
  +    my $self = {};
  +    bless $self, $class;
  +
  +    my ($name, $args, $i);
  +    if ($#_ == -1) {
  +        $args = {};
  +        $name = "default";
  +    }
  +    else {
  +        if (ref($_[0]) eq "HASH") {
  +            $args = shift;
  +            $name = shift if ($#_ % 2 == 0);
  +            for ($i = 0; $i < $#_; $i++) {
  +                $args->{$_[$i]} = $_[$i+1];
  +            }
  +        }
  +        else {
  +            $name = shift if ($#_ % 2 == 0);
  +            $args = ($#_ > -1) ? { @_ } : {};
  +        }
  +        $name = $args->{name} if (!$name);
  +        $name = "default" if (!$name);
  +    }
   
  -=head1 Constructor Methods:
  +    $self->init($args);
   
  -=cut
  +    return $self;
  +}
   
   #############################################################################
  -# Method: new()
  +# PROTECTED METHODS
   #############################################################################
   
  -=head2 Method: new()
  +=head1 Protected Methods:
   
  -The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +The following methods are intended to be called by subclasses of the
  +current class.
   
   =cut
   
   #############################################################################
  -# PUBLIC METHODS
  +# Method: init()
   #############################################################################
  -
  -=head1 Public Methods:
   
  -=cut
  -
  -#############################################################################
  -# Method: perform()
  -#############################################################################
  +=head2 init()
   
  -=head2 Method: perform()
  +The init() method is called from within the standard Service constructor.
  +The init() method in this class does nothing.
  +It allows subclasses of the Service to customize the behavior of the
  +constructor by overriding the init() method. 
   
  -    * Signature: $service->perform($request, $response);
  -    * Signature: $response = $service->perform($request);
  -    * Signature: $response = $service->perform(%named);
  -    * Param:     $request           ref   [in]
  -    * Param:     $response          ref   [out]
  -    * Return:    $response          ref
  -    * Throws:    P5EEx::Blue::Exception::Service
  +    * Signature: init($named)
  +    * Param:     $named      {}   [in]
  +    * Return:    void
  +    * Throws:    P5EEx::Blue::Exception
       * Since:     0.01
   
       Sample Usage: 
   
  -    $service->perform($request, $response);
  -    $response = $service->perform($request);
  -    $response = $service->perform(%named);
  +    $service->init($args);
   
   =cut
   
  -sub perform {
  -    my $self = shift;
  +sub init {
  +    my ($self, $args) = @_;
   }
   
   =head1 ACKNOWLEDGEMENTS
  @@ -138,8 +140,9 @@
   
   =head1 SEE ALSO
   
  +L<C<P5EEx::Blue::P5EE>|P5EEx::Blue::P5EE>,
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Config>|P5EEx::Blue::Config>
   
   =cut
   
  
  
  
  1.2       +12 -12    p5ee/P5EEx/Blue/P5EEx/Blue/Templates.pm
  
  Index: Templates.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Templates.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Templates.pm      2001/11/22 05:16:59     1.1
  +++ Templates.pm      2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Templates.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Templates.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Templates;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,14 +19,14 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $templates = $context->component("Templates");  # or ...
  +    $templates = $context->service("Templates");  # or ...
       $templates = $context->templates();
   
       ... TBD ...
   
   =head1 DESCRIPTION
   
  -A Templates Component is a means by which a template (such as an
  +A Templates Service is a means by which a template (such as an
   HTML template) may be rendered (with variables interpolated).
   
   =cut
  @@ -69,7 +69,7 @@
   
   =head1 Class: P5EEx::Blue::Templates
   
  -A Templates Component is a means by which a template (such as an
  +A Templates Service is a means by which a template (such as an
   HTML template) may be rendered (with variables interpolated).
   
    * Throws: P5EEx::Blue::Exception::Templates
  @@ -90,13 +90,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -109,10 +109,10 @@
   =cut
   
   #############################################################################
  -# Method: TBD()
  +# TBD()
   #############################################################################
   
  -=head2 Method: TBD()
  +=head2 TBD()
   
       * Signature: $tbd_return = $repository->tbd($tbd_param);
       * Param:     $tbd_param         integer
  @@ -138,7 +138,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.2       +12 -12    p5ee/P5EEx/Blue/P5EEx/Blue/Widget.pm
  
  Index: Widget.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Widget.pm,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- Widget.pm 2001/11/22 05:16:59     1.1
  +++ Widget.pm 2001/11/30 16:00:52     1.2
  @@ -1,12 +1,12 @@
   
   #############################################################################
  -## $Id: Widget.pm,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: Widget.pm,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Widget;
   
  -use P5EEx::Blue::Component;
  -@ISA = ( "P5EEx::Blue::Component" );
  +use P5EEx::Blue::Service;
  +@ISA = ( "P5EEx::Blue::Service" );
   
   use strict;
   
  @@ -19,14 +19,14 @@
       use P5EEx::Blue::P5EE;
   
       $context = P5EEx::Blue::P5EE->context();
  -    $widget = $context->component("Widget");  # or ...
  +    $widget = $context->service("Widget");  # or ...
       $widget = $context->widget();
   
       ... TBD ...
   
   =head1 DESCRIPTION
   
  -A Widget Component is a means by which an object can be manipulated
  +A Widget Service is a means by which an object can be manipulated
   without having to worry about its lifecycle (i.e. persistence,
   saving and restoring state, etc.) or its location (local or remote).
   
  @@ -72,7 +72,7 @@
   
   =head1 Class: P5EEx::Blue::Widget
   
  -A Widget Component is a means by which an object can be manipulated
  +A Widget Service is a means by which an object can be manipulated
   without having to worry about its lifecycle (i.e. persistence,
   saving and restoring state, etc.) or its location (local or remote).
   
  @@ -94,13 +94,13 @@
   =cut
   
   #############################################################################
  -# Method: new()
  +# new()
   #############################################################################
   
  -=head2 Method: new()
  +=head2 new()
   
   The constructor is inherited from
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component/"Method: new()">.
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
   
   =cut
   
  @@ -113,10 +113,10 @@
   =cut
   
   #############################################################################
  -# Method: TBD()
  +# TBD()
   #############################################################################
   
  -=head2 Method: TBD()
  +=head2 TBD()
   
       * Signature: $tbd_return = $repository->tbd($tbd_param);
       * Param:     $tbd_param         integer
  @@ -142,7 +142,7 @@
   =head1 SEE ALSO
   
   L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  -L<C<P5EEx::Blue::Component>|P5EEx::Blue::Component>
  +L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
   
   =cut
   
  
  
  
  1.3       +1 -1      p5ee/P5EEx/Blue/P5EEx/Blue/datetime.pod
  
  Index: datetime.pod
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/datetime.pod,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- datetime.pod      2001/11/17 17:50:03     1.2
  +++ datetime.pod      2001/11/30 16:00:52     1.3
  @@ -6,7 +6,7 @@
   
   =head1 NAME
   
  -P5EE Date and Time Considerations
  +P5EEx::Blue::datetime - P5EE Date and Time Considerations
   
   =head1 INTRODUCTION
   
  
  
  
  1.2       +12 -10    p5ee/P5EEx/Blue/P5EEx/Blue/perlstyle.pod
  
  Index: perlstyle.pod
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/perlstyle.pod,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- perlstyle.pod     2001/11/22 05:16:59     1.1
  +++ perlstyle.pod     2001/11/30 16:00:52     1.2
  @@ -1,12 +1,11 @@
  -#!perl -w
  -# run this document through perl to check its syntax
  -use Pod::Checker;
  -podchecker(\*DATA);
  -__END__
   
  +#############################################################################
  +## $Id: perlstyle.pod,v 1.2 2001/11/30 16:00:52 spadkins Exp $
  +#############################################################################
  +
   =head1 NAME
   
  -perlstyle - P5EE Style Guide
  +P5EEx::Blue::perlstyle - P5EE Style Guide
   
   =head1 INTRODUCTION
   
  @@ -417,7 +416,7 @@
   
   Naming for modules should be according to the following general rules.
   
  -    All P5EE components which have *broad* support from the 
  +    All P5EE services which have *broad* support from the 
           [EMAIL PROTECTED] list would go into the "P5EE" package
       Naming style is similar to other modules on CPAN
       Naming choice draws from precedent of other modules on CPAN
  @@ -752,7 +751,7 @@
   Contact for core team is the P5EE-development mailing list.
   Discuss all ideas there.
   
  -The basic process for a new P5EE component is:
  +The basic process for a new P5EE service is:
   
       get the blessing from the P5EE list for a top-level package name
       (i.e. "P5EE::NewModule")
  @@ -793,6 +792,9 @@
   =head1 CHANGES
   
       $Log: perlstyle.pod,v $
  +    Revision 1.2  2001/11/30 16:00:52  spadkins
  +    Renamed 'Component' to 'Service' throughout. Improved perldocs.
  +
       Revision 1.1  2001/11/22 05:16:59  spadkins
       Major new architectural framework proposal
   
  @@ -803,6 +805,6 @@
   
   =head1 VERSION
   
  -$Id: perlstyle.pod,v 1.1 2001/11/22 05:16:59 spadkins Exp $
  +$Id: perlstyle.pod,v 1.2 2001/11/30 16:00:52 spadkins Exp $
   
   
  
  
  
  1.3       +6 -6      p5ee/P5EEx/Blue/P5EEx/Blue/podstyle.pod
  
  Index: podstyle.pod
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/podstyle.pod,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -w -r1.2 -r1.3
  --- podstyle.pod      2001/11/22 05:16:59     1.2
  +++ podstyle.pod      2001/11/30 16:00:52     1.3
  @@ -1,6 +1,6 @@
   
   #############################################################################
  -## $Id: podstyle.pod,v 1.2 2001/11/22 05:16:59 spadkins Exp $
  +## $Id: podstyle.pod,v 1.3 2001/11/30 16:00:52 spadkins Exp $
   #############################################################################
   
   =head1 NAME
  @@ -48,10 +48,10 @@
     # Main .pm in Distribution only
     =head1 Distribution: <Dist-name>
     <description>
  -  =item * Version: $Id: podstyle.pod,v 1.2 2001/11/22 05:16:59 spadkins Exp $
  +  =item * Version: $Id: podstyle.pod,v 1.3 2001/11/30 16:00:52 spadkins Exp $
     =head2 Distribution Requirements
     =head2 Distribution Design
  -  =head2 Distribution Components
  +  =head2 Class Groups:
     =item * Class Group: <Class-Group-name>
     <description>
   
  @@ -60,7 +60,7 @@
     <description>
     =head2 Class Group Requirements
     =head2 Class Group Design
  -  =head2 Class Group Components
  +  =head2 Classes:
     =item * Class: <Class-name>
     <description>
   
  @@ -72,7 +72,7 @@
     =item * Since: <Version-Number>
     =head2 Class Requirements
     =head2 Class Design
  -  =head2 Class Capabilities
  +  =head2 Capabilities:
     =item * Capability: <Capability-Name>
     <description>
   
  @@ -94,7 +94,7 @@
     =head1 Private Methods: [<Capability-Name>]
   
     # Every method (each if applicable)
  -  =head2 Method: <Method-Name>
  +  =head2 <Method-Name>()
         * Signature:  <Sample-Usage-Illustrating-The-Signature>
         * Param:      <Param-Name> <Type> <In/Out> <Undef-OK>
         * Return:     <Return-Name> <Type> <Undef-OK>
  
  
  
  1.1                  p5ee/P5EEx/Blue/P5EEx/Blue/Procedure.pm
  
  Index: Procedure.pm
  ===================================================================
  
  #############################################################################
  ## $Id: Procedure.pm,v 1.1 2001/11/30 16:00:52 spadkins Exp $
  #############################################################################
  
  package P5EEx::Blue::Procedure;
  
  use P5EEx::Blue::Service;
  @ISA = ( "P5EEx::Blue::Service" );
  
  use strict;
  
  =head1 NAME
  
  P5EEx::Blue::Procedure - synchronous (potentially remote) procedure invocation
  
  =head1 SYNOPSIS
  
      use P5EEx::Blue::P5EE;
  
      $context = P5EEx::Blue::P5EE->context();
      $procedure = $context->service("Procedure");  # or ...
      $procedure = $context->procedure();
  
      $procedure->execute($request, $response);
      $response = $procedure->execute($request);
      $response = $procedure->execute(%named);
  
  =head1 DESCRIPTION
  
  A Procedure service is a means by which a function call (perhaps remote)
  may be made synchronously.
  
  =cut
  
  #############################################################################
  # CLASS GROUP
  #############################################################################
  
  =head1 Class Group: Procedure
  
  The following classes might be a part of the Procedure Class Group.
  
  =over
  
  =item * Class: P5EEx::Blue::Procedure
  
  =item * Class: P5EEx::Blue::Procedure::Local
  
  =item * Class: P5EEx::Blue::Procedure::SOAP
  
  =item * Class: P5EEx::Blue::Procedure::pRPC
  
  =item * Class: P5EEx::Blue::Procedure::PlRPC
  
  =item * Class: P5EEx::Blue::Procedure::Messaging
  
  =back
  
  =cut
  
  #############################################################################
  # CLASS
  #############################################################################
  
  =head1 Class: P5EEx::Blue::Procedure
  
  A Procedure service is a means by which a function call (perhaps remote)
  may be made synchronously.
  
   * Throws: P5EEx::Blue::Exception::Procedure
   * Since:  0.01
  
  =head2 Class Design
  
  ...
  
  =cut
  
  #############################################################################
  # CONSTRUCTOR METHODS
  #############################################################################
  
  =head1 Constructor Methods:
  
  =cut
  
  #############################################################################
  # new()
  #############################################################################
  
  =head2 new()
  
  The constructor is inherited from
  L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
  
  =cut
  
  #############################################################################
  # PUBLIC METHODS
  #############################################################################
  
  =head1 Public Methods:
  
  =cut
  
  #############################################################################
  # execute()
  #############################################################################
  
  =head2 execute()
  
      * Signature: $procedure->execute($request, $response);
      * Signature: $response = $procedure->execute($request);
      * Signature: $response = $procedure->execute(%named);
      * Param:     $request           ref   [in]
      * Param:     $response          ref   [out]
      * Return:    $response          ref
      * Throws:    P5EEx::Blue::Exception::Procedure
      * Since:     0.01
  
      Sample Usage: 
  
      $procedure->execute($request, $response);
      $response = $procedure->execute($request);
      $response = $procedure->execute(%named);
  
  =cut
  
  sub execute {
      my $self = shift;
  }
  
  =head1 ACKNOWLEDGEMENTS
  
   * Author:  Stephen Adkins <[EMAIL PROTECTED]>
   * License: This is free software. It is licensed under the same terms as Perl 
itself.
  
  =head1 SEE ALSO
  
  L<C<P5EEx::Blue::Context>|P5EEx::Blue::Context>,
  L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service>
  
  =cut
  
  1;
  
  
  
  
  1.1                  p5ee/P5EEx/Blue/P5EEx/Blue/Session.pm
  
  Index: Session.pm
  ===================================================================
  
  #############################################################################
  ## $Id: Session.pm,v 1.1 2001/11/30 16:00:52 spadkins Exp $
  #############################################################################
  
  package P5EEx::Blue::Session;
  
  use P5EEx::Blue::Service;
  @ISA = ( "P5EEx::Blue::Service" );
  
  use strict;
  
  =head1 NAME
  
  P5EEx::Blue::Session - represents a sequence of multiple events
  perhaps executed in separate processes
  
  =head1 SYNOPSIS
  
     # ... official way to get a Session object ...
     use P5EEx::Blue::P5EE;
     $session = P5EEx::Blue::P5EE->session();
     $session = $session->session();   # get the session
  
     # any of the following named parameters may be specified
     $session = $session->session(
     );
  
     # ... alternative way (used internally) ...
     use P5EEx::Blue::Session;
     $session = P5EEx::Blue::Session->new();
  
  =cut
  
  #############################################################################
  # CONSTANTS
  #############################################################################
  
  =head1 DESCRIPTION
  
  A Session class models the sequence of events associated with a
  use of the system.  These events may occur in different processes.
  
  For instance, in a web environment, when a new user arrives at a web site,
  he is allocated a new
  Session, even though he may not even be authenticated.  In subsequent
  requests, his actions are tied together by a Session ID that is transmitted
  from the browser to the server on each request.  During the Session, he
  may log in, log out, and log in again.
  Finally, Sessions in the web environment generally time out if not 
  accessed for a certain period of time.
  
  Conceptually, the Session may span processes, so they generally have a
  way to persist themselves so that they may be reinstantiated wherever
  they are needed.  This would certainly be true in CGI or Cmd Contexts
  where each CGI request or command execution relies on and contributes
  to the running state accumulated in the Session.  Other execution
  Contexts (Curses, Gtk) only require trivial implementations of a Session
  because it stays in memory for the duration of the process.
  Nonetheless, even these Contexts use a Session object so that the
  programming model across multiple platforms is the same.
  
  =cut
  
  #############################################################################
  # CLASS GROUP
  #############################################################################
  
  =head1 Class Group: Session
  
  The following classes might be a part of the Session Class Group.
  
  =over
  
  =item * Class: P5EEx::Blue::Session
  
  =item * Class: P5EEx::Blue::Session::ApacheSession
  
  =item * Class: P5EEx::Blue::Session::ApacheSessionX
  
  =item * Class: P5EEx::Blue::Session::HTMLHidden
  
  =back
  
  =cut
  
  #############################################################################
  # CONSTRUCTOR METHODS
  #############################################################################
  
  =head1 Constructor Methods:
  
  =cut
  
  #############################################################################
  # new()
  #############################################################################
  
  =head2 new()
  
  The constructor is inherited from
  L<C<P5EEx::Blue::Service>|P5EEx::Blue::Service/"new()">.
  
  =cut
  
  #############################################################################
  # PUBLIC METHODS
  #############################################################################
  
  =head1 Public Methods:
  
  =cut
  
  #############################################################################
  # TBD()
  #############################################################################
  
  =head2 TBD()
  
  The TBD() method ...
  
      * Signature: $session->TBD(@args);
      * Param:  @args        string  [in]
      * Return: void
      * Throws: <none>
      * Since:  0.01
  
      Sample Usage: 
  
      $session->TBD();
  
  =cut
  
  sub TBD {
      my $self = shift;
  }
  
  1;
  
  
  
  
  1.2       +44 -19    p5ee/P5EEx/Blue/htdocs/api/perldocs.css
  
  Index: perldocs.css
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/htdocs/api/perldocs.css,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- perldocs.css      2001/11/27 21:00:36     1.1
  +++ perldocs.css      2001/11/30 16:00:53     1.2
  @@ -1,29 +1,54 @@
   /* perldocs style sheet */
   
  -/* Define colors, fonts and other style attributes here to override the defaults */
  +body {
  +    background-color: white;
  +    color: black;
  +}
  +
  +/* because netscape 4 doesn't inherit from the body class we need to specify 
everything?!, gaah ... */
  +body, table, td, p, span, h1, h2, h3, ul {
  +    font-size: 10pt;
  +    font-family: Verdana, Helvetica, Arial, Univers, sans-serif
  +}
  +
  +h1       { font-size: 155%; font-weight: bold; }
  +h2       { font-size: 125%; font-weight: bold; }
  +h3       { font-weight: bold; }
  +
  +a:link   { color: #660000; }
  +a:active { color: #990000; }
  +a:hover  { color: #660000; }
  +a:vlink  { color: #990000; }
   
  -/* Page background color */
  -body { background-color: #FFFFFF }
  -
   /* Table colors */
  -.TableHeadingColor     { background: #CCCCFF } /* Dark mauve */
  -.TableSubHeadingColor  { background: #EEEEFF } /* Light mauve */
  -.TableRowColor         { background: #FFFFFF } /* White */
  +.TableHeadingColor     { background-color: #FFCCCC; }
  +.TableSubHeadingColor  { background-color: #CC9999; }
  +.TableRowColor         { background-color: #FFFFFF; }
   
   /* Font used in left-hand frame lists */
  -.FrameTitleFont   { font-size: 10pts; font-family: Helvetica, Arial, san-serif }
  -.FrameHeadingFont { font-size: 10pts; font-family: Helvetica, Arial, san-serif }
  -.FrameItemFont    { font-size: 10pts; font-family: Helvetica, Arial, san-serif }
  -
  -/* Example of smaller, sans-serif font in frames */
  -/* .FrameItemFont  { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
  +.FrameTitleFont   {
  +    background-color: #FFCCCC;
  +    font-size: 12pt;
  +    font-weight: bold;
  +    font-family: Verdana, Helvetica, Arial, Univers, sans-serif;
  +}
  +.FrameHeadingFont {
  +    background-color: #FFCCCC;
  +    font-size: 12pt;
  +    font-weight: bold;
  +    font-family: Verdana, Helvetica, Arial, Univers, sans-serif;
  +}
  +.FrameItemFont    {
  +    font-size: 10pt;
  +    font-family: Verdana, Helvetica, Arial, Univers, sans-serif;
  +}
   
   /* Navigation bar fonts and colors */
  -.NavBarCell1    { background-color:#EEEEFF;}/* Light mauve */
  -.NavBarCell1Rev { background-color:#00008B;}/* Dark Blue */
  -.NavBarFont1    { font-family: Arial, Helvetica, sans-serif; color:#000000;}
  -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
  +.NavBarCell1    { background-color: #FFCCCC; }
  +.NavBarCell1Rev { background-color: #990000; }
  +.NavBarFont1    { font-family: Verdana, Helvetica, Arial, Univers, sans-serif; 
color: #990000; }
  +.NavBarFont1Rev { font-family: Verdana, Helvetica, Arial, Univers, sans-serif; 
color: #FFCCCC; }
   
  -.NavBarCell2    { font-family: Arial, Helvetica, sans-serif; 
background-color:#FFFFFF;}
  -.NavBarCell3    { font-family: Arial, Helvetica, sans-serif; 
background-color:#FFFFFF;}
  +.NavBarCell2    { font-family: Verdana, Helvetica, Arial, Univers, sans-serif; 
background-color: #FFFFFF; }
  +.NavBarCell3    { font-family: Verdana, Helvetica, Arial, Univers, sans-serif; 
background-color: #FFFFFF; }
   
  
  
  
  1.2       +646 -185  p5ee/P5EEx/Blue/sbin/perldocs
  
  Index: perldocs
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/sbin/perldocs,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -r1.1 -r1.2
  --- perldocs  2001/11/27 20:58:37     1.1
  +++ perldocs  2001/11/30 16:00:53     1.2
  @@ -2,7 +2,18 @@
   
   use Date::Format;
   
  -%opt_descriptions = (
  +use strict;
  +
  +my ($docroot, $dir, $pmlibdirs, $distname, $version, $datetime);
  +my (%data, %source_file);
  +my %warning = (
  +    "mfiup", "Module file [%s] includes unexpected package [%s]\n",
  +    "mdnh2", "Module file [%s] contains method [%s] documentation not as 
'=head2'\n",
  +    "mwnd",  "Module file [%s] contains method [%s] with no documentation\n",
  +);
  +
  +{
  +    my %opt_descriptions = (
       'dir'       => "Directory to correct outputted HTML POD documentation",
       'docroot'   => "Base of URL tree (corresponding to 'dir' in the directory 
tree)",
       'distname'  => "Distribution name",
  @@ -10,17 +21,12 @@
       'pmlibdirs' => "Directories to scan for .pod and .pm source files",
   );
   
  -%opts = (
  +    my %opts = (
       'dir' => "htdocs",
       'docroot' => "",
   );
   
  -my %warning = (
  -    "mfiup", "Module file [%s] includes unexpected package [%s]\n",
  -    "mdnh2", "Module file [%s] contains method [%s] documentation not as 
'=head2'\n",
  -    "mwnd",  "Module file [%s] contains method [%s] with no documentation\n",
  -);
  -
  +    my ($option);
   if ($#ARGV == -1) {
       print STDERR "Usage: $0 [options]\n";
       foreach $option (sort keys %opt_descriptions) {
  @@ -29,6 +35,7 @@
       exit (1);
   }
   
  +    my ($arg, $var, $value);
   foreach $arg (@ARGV) {
       if ($arg =~ /^([^=]+)=(.*)/) {
           $var = $1;
  @@ -58,6 +65,7 @@
       $pmlibdirs =~ s/,/ /g;
   
       # replace this with the Perl version of "find" someday
  +        my (@podfiles, $podfile, $module);
       open (FIND, "find $pmlibdirs -name '*.pod' -print |") || die "Unable to get 
file list: $!\n";
       @podfiles = <FIND>;
       close(FIND);
  @@ -75,6 +83,7 @@
       }
   
       # replace this with the Perl version of "find" someday
  +        my (@pmfiles, $pmfile);
       open (FIND, "find $pmlibdirs -name '*.pm' -print |") || die "Unable to get file 
list: $!\n";
       @pmfiles = <FIND>;
       close(FIND);
  @@ -97,6 +106,9 @@
   #############################################################################
   
   if ($dir && $docroot) {
  +        my (@htmlfiles, $htmlfile, $html, $modified, $unmodified_head, 
$modified_head);
  +        my ($title, $short_title);
  +
       # replace this with the Perl version of "find" someday
       open (FIND, "find $dir -name '*.html' -print |") || die "Unable to get file 
list: $!\n";
       @htmlfiles = <FIND>;
  @@ -135,7 +147,7 @@
   <link rel="stylesheet" type="text/css" href="$docroot/style.css">
   </HEAD>
   
  -<BODY bgcolor="white" link="#690020" alink="#003600" vlink="#900000">
  +<BODY bgcolor="white" link="#660000" alink="#990000" vlink="#990000">
   <table border="0" cellspacing="0">
     <tr>
       <td valign=middle><img src="$docroot/images/logo.gif" border="0"></td>
  @@ -155,6 +167,9 @@
   
       &write_docs();
   }
  +}
  +
  +exit 0;
    
   #############################################################################
   # Workhorse functions
  @@ -168,14 +183,18 @@
   # $data{distribution}{$distribution}{design}
   #
   # $data{classgroup}{$classgroup}
  +# $data{classgroup}{$classgroup}{description}
   # $data{classgroup}{$classgroup}{requirements}
   # $data{classgroup}{$classgroup}{design}
  +# $data{classgroup}{$classgroup}{podclass}
   # $data{classgroup}{$classgroup}{classes}
   # $data{classgroup}{$classgroup}{class}{$class}{description}
   # $data{classgroup}{$classgroup}{class}{$class}{podclass}
   #
   # $data{class}{$class}
  +# $data{class}{$class}{parent}
   # $data{class}{$class}{parents}
  +# $data{class}{$class}{children}
   # $data{class}{$class}{classgroup}
   # $data{class}{$class}{podclass}
   # $data{class}{$class}{name}
  @@ -214,10 +233,12 @@
       my (@package_frags, $pf, $package, $pfrag);
       my (@head_frags, $hf, $headlevel, $headtext, $hfrag);
       my (@sub_frags, $sf, $sub, $sfrag);
  +    my ($dist_name, $class_list, $class_group, $class, $description, $capability, 
$method);
   
       # search each package
       @package_frags = split(/(\npackage .*\n)/, $source);
  -    for ($pf = 1; $pf <= $#package_frags; $pf += 2) {
  +    unshift(@package_frags, "package $module;");
  +    for ($pf = 0; $pf <= $#package_frags; $pf += 2) {
   
           if ($package_frags[$pf] =~ /package +([A-Za-z0-9:_-]+);/) {
   
  @@ -228,14 +249,39 @@
               #print "package=[$package] pfrag=[$pfrag]\n";
   
               # save info about where this class (package) was detected
  -            $data{classgroup}{allclasses}{classes} = [] if (! defined 
$data{classgroup}{allclasses}{classes});
  +            $data{classgroup}{allclasses}{classes} = []
  +                if (! defined $data{classgroup}{allclasses}{classes});
  +            if (! defined $data{classgroup}{allclasses}{class}{$package}) {
               push(@{$data{classgroup}{allclasses}{classes}}, $package);
  -            if ($source =~ /\n=head1 /s) {  # there must be some POD in the file
  +                $data{classgroup}{allclasses}{class}{$package} = {};
  +            }
  +
  +            # take not of the module that POD for the package is in
  +            if ($pfrag =~ /\n=head1 /s) {
                   $data{class}{$package}{podclass} = $module;
               }
   
  +            # Scan the ISA list to get the inheritance tree
  +            if ($pfrag =~ /\@ISA *= *([^;#]*)/) {
  +                $class_list = $1;
  +                while ($class_list =~ /([A-Z][A-Za-z0-9_:]+)/g) {
  +                    $class = $1;
  +                    $data{class}{$package}{parent} = $class
  +                        if (!defined $data{class}{$package}{parent});
  +                    if (!defined $data{class}{$package}{parents}) {
  +                        $data{class}{$package}{parents} = []
  +                    }
  +                    else {
  +                        push(@{$data{class}{$package}{parents}}, $class);
  +                    }
  +                    $data{class}{$class}{children} = []
  +                        if (!defined $data{class}{$class}{children});
  +                    push(@{$data{class}{$class}{children}}, $package);
  +                }
  +            }
  +
               # search each =head POD directive
  -            @head_frags = split(/(\n=head[12] .*\n)/, $source);
  +            @head_frags = split(/(\n=head[12] .*\n)/, $pfrag);
               for ($hf = 1; $hf <= $#head_frags; $hf += 2) {
                   if ($head_frags[$hf] =~ /=head([12]) +(.*)/) {
                       $headlevel = $1;
  @@ -257,6 +303,13 @@
                           $dist_name = $1;
                       }
                       elsif ($headtext =~ /Class Groups/) {
  +                        while ($hfrag =~ / \* Class Group: *([^-\n]+)( *\n *- 
*([^\n]+))?/sg) {
  +                            $class_group = $1;
  +                            $description = $3;
  +                            $class_group =~ s/[\|>].*//;
  +                            $class_group =~ s/.*<//;
  +                            $data{classgroup}{$class_group}{description} = 
$description;
  +                        }
                       }
                       elsif ($headtext =~ /Class Group Requirements/) {
                       }
  @@ -264,17 +317,29 @@
                       }
                       elsif ($headtext =~ /Class Group: *(.*)/) {
                           $class_group = $1;
  -                        if (!defined $class_group{$class_group}) {
  -                            $class_group{$class_group} = 1;
  -                            push(@class_groups, $class_group);
  -                        }
  -                        while ($hfrag =~ / \* Class: *([^ \n]+)/g) {
  -                            $class = $1;
  +                        $class_group =~ s/[\|>].*//;
  +                        $class_group =~ s/.*<//;
  +                        $data{classgroup}{$class_group}{podclass} = $module;
  +                        while ($hfrag =~ / \* (Class|Document): *([^\n]+)/sg) {
  +                            $class = $2;
  +                            $class =~ s/[\|>].*//;
  +                            $class =~ s/.*<//;
  +
                               $data{classgroup}{$class_group}{classes} = []
                                   if (! defined 
$data{classgroup}{$class_group}{classes});
  +                            if (! defined 
$data{classgroup}{$class_group}{class}{$class}) {
                               push(@{$data{classgroup}{$class_group}{classes}}, 
$class);
  +                                $data{classgroup}{$class_group}{class}{$class} = {};
  +                            }
  +
  +                            $data{classgroup}{allclasses}{classes} = []
  +                                if (! defined 
$data{classgroup}{allclasses}{classes});
  +                            if (! defined 
$data{classgroup}{allclasses}{class}{$class}) {
  +                                push(@{$data{classgroup}{allclasses}{classes}}, 
$class);
  +                                $data{classgroup}{allclasses}{class}{$class} = {};
                           }
                       }
  +                    }
                       elsif ($headtext =~ /Class: *(.*)/) {
                           $class = $1;
                       }
  @@ -296,7 +361,7 @@
                       elsif ($headtext =~ /Public Methods: *(.*)/) {
                           $capability = $1;
                       }
  -                    elsif ($headtext =~ /Method: *(.+)\(\)/) {
  +                    elsif ($headtext =~ / *(.+)\(\)/) {
                           $method = $1;
                           &docwarn("mdnh2", $file, $method) if ($headlevel != 2);
                           $hfrag =~ s/\nsub .*//s;
  @@ -341,6 +406,8 @@
   sub write_docs {
       &write_index();
       &write_overview();
  +    &write_overview_summary();
  +    &write_overview_tree();
   }
   
   sub write_index {
  @@ -350,9 +417,7 @@
   <HTML>
   <HEAD>
   <!-- Generated by perldocs on $datetime -->
  -<TITLE>
  -$distname-$version
  -</TITLE>
  +  <TITLE>$distname-$version</TITLE>
   </HEAD>
   <FRAMESET cols="20%,80%">
   <FRAMESET rows="30%,70%">
  @@ -381,39 +446,33 @@
   <HTML>
   <HEAD>
   <!-- Generated by perldocs on $datetime -->
  -<TITLE>
  -Overview ($distname-$version)
  -</TITLE>
  +  <TITLE>Overview ($distname-$version)</TITLE>
   <LINK REL ="stylesheet" TYPE="text/css" HREF="perldocs.css" TITLE="Style">
  -</HEAD>
   <SCRIPT>
  -function asd()
  -{
  +    function asd() {
       parent.document.title="Overview ($distname-$version)";
   }
   </SCRIPT>
  -<BODY BGCOLOR="white" onload="asd();">
  +</HEAD>
  +<BODY bgcolor="white" link="#660000" alink="#990000" vlink="#990000" 
onload="asd();">
   
   <TABLE BORDER="0" WIDTH="100%">
   <TR>
  -<TD NOWRAP><FONT size="+1" CLASS="FrameTitleFont">
  -<B>$distname-$version</B></FONT></TD>
  +    <TD NOWRAP><FONT size="+1" 
CLASS="FrameTitleFont"><B>$distname-$version</B></FONT></TD>
   </TR>
   </TABLE>
   
   <TABLE BORDER="0" WIDTH="100%">
   <TR>
  -<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="allclasses-frame.html" 
TARGET="packageFrame">All Classes</A></FONT>
  -<P>
  -<FONT size="+1" CLASS="FrameHeadingFont">
  -Class Groups</FONT>
  -<BR>
  +    <TD NOWRAP>
  +      <FONT CLASS="FrameItemFont"><A HREF="allclasses-frame.html" 
TARGET="packageFrame">All Classes</A></FONT><P>
  +      <FONT size="+1" CLASS="FrameHeadingFont">Class Groups</FONT><BR>
   EOF
   
  -    foreach $class_group (@class_groups) {
  +    my ($class_group);
  +    foreach $class_group (sort keys %{$data{classgroup}}) {
           $html .= <<EOF;
  -<FONT CLASS="FrameItemFont"><A HREF="${class_group}-frame.html" 
TARGET="packageFrame">$class_group</A></FONT>
  -<BR>
  +      <FONT CLASS="FrameItemFont"><A HREF="${class_group}-frame.html" 
TARGET="packageFrame">$class_group</A></FONT><BR>
   EOF
           &write_class_frame($class_group);
       }
  @@ -441,27 +500,23 @@
   <HTML>
   <HEAD>
   <!-- Generated by perldocs on $datetime -->
  -<TITLE>
  -$title
  -</TITLE>
  +  <TITLE>$title</TITLE>
   <LINK REL ="stylesheet" TYPE="text/css" HREF="perldocs.css" TITLE="Style">
  -</HEAD>
   <SCRIPT>
  -function asd()
  -{
  +    function asd() {
       parent.document.title="All Classes";
   }
   </SCRIPT>
  -<BODY BGCOLOR="white" onload="asd();">
  -<FONT size="+1" CLASS="FrameHeadingFont">
  -<B>$title</B></FONT>
  -<BR>
  +</HEAD>
  +<BODY bgcolor="white" link="#660000" alink="#990000" vlink="#990000" 
onload="asd();">
   
  +<FONT size="+1" CLASS="FrameHeadingFont"><B>$title</B></FONT><BR>
  +
   <TABLE BORDER="0" WIDTH="100%">
   <TR>
   <TD NOWRAP><FONT CLASS="FrameItemFont">
   EOF
  -    my ($htmlfile, $classname);
  +    my ($htmlfile, $class, $classname);
   
       foreach $class (sort @{$data{classgroup}{$class_group}{classes}}) {
           $classname = $class;
  @@ -492,20 +547,426 @@
   
       &write_file("$dir/api/${class_group}-frame.html", $html);
   }
  +
  +sub write_overview_summary {
  +    my ($html);
  +    $html = <<EOF;
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 
Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd";>
  +<!--NewPage-->
  +<HTML>
  +<HEAD>
  +  <!-- Generated by javadoc on Wed Oct 10 20:02:45 PDT 2001 -->
  +  <TITLE>Overview ($distname-$version)</TITLE>
  +  <LINK REL="stylesheet" TYPE="text/css" HREF="perldocs.css" TITLE="Style">
  +  <SCRIPT>
  +    function asd() {
  +      parent.document.title="Overview ($distname-$version)";
  +    }
  +  </SCRIPT>
  +</HEAD>
  +<BODY bgcolor="white" link="#660000" alink="#990000" vlink="#990000" 
onload="asd();">
  +
  +<!-- ========== START OF NAVBAR ========== -->
  +<A NAME="navbar_top"><!-- --></A>
  +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
  +  <TR>
  +    <TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +      <A NAME="navbar_top_firstrow"><!-- --></A>
  +      <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
  +        <TR ALIGN="center" VALIGN="top">
  +          <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">&nbsp;
  +            <FONT CLASS="NavBarFont1Rev"><B>Overview</B></FONT>&nbsp;
  +          </TD>
  +          <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +            <FONT CLASS="NavBarFont1">Class-Group</FONT>&nbsp;
  +          </TD>
  +          <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +            <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;
  +          </TD>
  +          <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +            <FONT CLASS="NavBarFont1">Use</FONT>&nbsp;
  +          </TD>
  +          <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +            <A HREF="overview-tree.html"><FONT 
CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;
  +          </TD>
  +          <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +            <A HREF="deprecated-list.html"><FONT 
CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;
  +          </TD>
  +        </TR>
  +      </TABLE>
  +    </TD>
  +    <TD ALIGN="right" VALIGN="top" ROWSPAN=3>
  +      <EM><b>$distname-$version</b></EM>
  +    </TD>
  +  </TR>
  +
  +  <TR>
  +    <TD BGCOLOR="white" CLASS="NavBarCell2">
  +      <FONT SIZE="-2">&nbsp;PREV&nbsp;&nbsp;NEXT</FONT>
  +    </TD>
  +    <TD BGCOLOR="white" CLASS="NavBarCell2">
  +      <FONT SIZE="-2">
  +        <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>&nbsp;&nbsp;
  +        <A HREF="overview-summary.html" TARGET="_top"><B>NO 
FRAMES</B></A>&nbsp;&nbsp;
  +        <SCRIPT>
  +          <!--
  +          if(window==top) {
  +            document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All 
Classes</B></A>');
  +          }
  +          //-->
  +        </SCRIPT>
  +        <NOSCRIPT>
  +        <A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
  +        </NOSCRIPT>
  +      </FONT>
  +    </TD>
  +  </TR>
  +</TABLE>
  +<!-- =========== END OF NAVBAR =========== -->
  +
  +<HR>
  +<CENTER>
  +<H2>$distname-$version API Specification</H2>
  +</CENTER>
  +This document is the API specification for the $distname-$version.
  +<P>
  +<B>See:</B>
  +<BR>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
HREF="#overview_description"><B>Description</B></A>
  +<P>
  +
  +<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" WIDTH="100%">
  +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
  +<TD COLSPAN=2><FONT SIZE="+2">
  +<B>$distname Class Groups</B></FONT></TD>
  +</TR>
  +EOF
  +
  +    my ($class_group, $description, $url);
  +    foreach $class_group (sort keys %{$data{classgroup}}) {
  +        $description = $data{classgroup}{$class_group}{description};
  +        $description = "The $class_group class group." if (!$description);
  +        $url = $data{classgroup}{$class_group}{podclass};
  +        if ($url) {
  +            $url =~ s!::!/!g;
  +            $url = "../$url" . lc("#Class Group: $class_group");
  +            $html .= <<EOF;
  +<TR BGCOLOR="white" CLASS="TableRowColor">
  +<TD WIDTH="20%"><B><A HREF="$url">$class_group</A></B></TD>
  +<TD>$description</TD>
  +</TR>
  +EOF
  +        }
  +        else {
  +            $html .= <<EOF;
  +<TR BGCOLOR="white" CLASS="TableRowColor">
  +<TD WIDTH="20%"><B>$class_group</B></TD>
  +<TD>$description</TD>
  +</TR>
  +EOF
  +        }
  +    }
  +
  +    $html .= <<EOF;
  +</TABLE>
  +
  +<P>
  +&nbsp;<A NAME="overview_description"><!-- --></A>
  +<P>
  +This document is the API specification for the $distname-$version.
  +<p>
  +<P>
  +
  +<P>
  +<HR>
  +
  +<!-- ========== START OF NAVBAR ========== -->
  +<A NAME="navbar_bottom"><!-- --></A>
  +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
  +<TR>
  +<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +<A NAME="navbar_bottom_firstrow"><!-- --></A>
  +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
  +  <TR ALIGN="center" VALIGN="top">
  +  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT 
CLASS="NavBarFont1Rev"><B>Overview</B></FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class-Group</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Use</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="overview-tree.html"><FONT 
CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A 
HREF="deprecated-list.html"><FONT 
CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
  +  </TR>
  +</TABLE>
  +</TD>
  +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  +<b>$distname-$version</b></EM>
  +</TD>
  +</TR>
  +
  +<TR>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +&nbsp;PREV&nbsp;
  +&nbsp;NEXT</FONT></TD>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +  <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>  &nbsp;
  +&nbsp;<A HREF="overview-summary.html" TARGET="_top"><B>NO FRAMES</B></A>  &nbsp;
  +&nbsp;
  +<SCRIPT>
  +  <!--
  +  if(window==top) {
  +    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All 
Classes</B></A>');
  +  }
  +  //-->
  +</SCRIPT>
  +<NOSCRIPT>
  +<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
  +</NOSCRIPT>
  +</FONT></TD>
  +</TR>
  +</TABLE>
  +<!-- =========== END OF NAVBAR =========== -->
  +
  +</BODY>
  +</HTML>
  +EOF
  +    &write_file("$dir/api/overview-summary.html", $html);
  +}
  +
  +sub write_overview_tree {
  +    &write_class_group_tree("allclasses");
  +    my ($class_group);
  +    foreach $class_group (sort keys %{$data{classgroup}}) {
  +        &write_class_group_tree($class_group);
  +    }
  +}
  +
  +sub write_class_group_tree {
  +    my ($this_class_group) = @_;
  +    my ($html);
  +    $html = <<EOF;
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 
Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd";>
  +<!--NewPage-->
  +<HTML>
  +<HEAD>
  +  <!-- Generated by perldocs on $datetime -->
  +  <TITLE>Class Hierarchy ($distname-$version)</TITLE>
  +  <LINK REL="stylesheet" TYPE="text/css" HREF="perldocs.css" TITLE="Style">
  +  <SCRIPT>
  +    function asd() {
  +      parent.document.title="Class Hierarchy ($distname-$version)";
  +    }
  +  </SCRIPT>
  +</HEAD>
  +<BODY bgcolor="white" link="#660000" alink="#990000" vlink="#990000" 
onload="asd();">
  +
  +<!-- ========== START OF NAVBAR ========== -->
  +<A NAME="navbar_top"><!-- --></A>
  +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
  +<TR>
  +<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +<A NAME="navbar_top_firstrow"><!-- --></A>
  +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
  +  <TR ALIGN="center" VALIGN="top">
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A 
HREF="overview-summary.html"><FONT 
CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class-Group</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Use</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT 
CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A 
HREF="deprecated-list.html"><FONT 
CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
  +  </TR>
  +</TABLE>
  +</TD>
  +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  +<b>$distname-$version</b></EM>
  +</TD>
  +</TR>
  +
  +<TR>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +&nbsp;PREV&nbsp;
  +&nbsp;NEXT</FONT></TD>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +  <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>  &nbsp;
  +&nbsp;<A HREF="overview-tree.html" TARGET="_top"><B>NO FRAMES</B></A>  &nbsp;
  +&nbsp;
  +<SCRIPT>
  +  <!--
  +  if(window==top) {
  +    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All 
Classes</B></A>');
  +  }
  +  //-->
  +</SCRIPT>
  +<NOSCRIPT>
  +<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
  +</NOSCRIPT>
  +</FONT></TD>
  +</TR>
  +</TABLE>
  +<!-- =========== END OF NAVBAR =========== -->
  +
  +<HR>
  +<CENTER>
  +<H2>
  +Hierarchy For All Class Groups</H2>
  +</CENTER>
  +<DL>
  +<DT>
  +    <B>Class Group Hierarchies:</B><DD>
  +EOF
  +
  +    my ($class_group);
  +    if ($this_class_group eq "allclasses") {
  +        foreach $class_group (sort keys %{$data{classgroup}}) {
  +            if ($class_group ne "allclasses") {
  +                $html .= "   <A 
HREF=\"${class_group}-tree.html\">$class_group</A>,\n";
  +            }
  +            else {
  +                $html .= "   <A HREF=\"overview-tree.html\">All Classes</A>\n";
  +            }
  +        }
  +    }
  +    else {
  +        $html .= "   <A HREF=\"overview-tree.html\">All Classes</A>\n";
  +    }
  +
  +    $html .= <<EOF;
  +</DD>
  +</DT>
  +</DL>
  +<HR>
  +<H2>
  +Class Hierarchy
  +</H2>
  +EOF
  +
  +    $html .= &class_group_tree($this_class_group);
  +
  +    $html .= <<EOF;
  +<HR>
  +
  +<!-- ========== START OF NAVBAR ========== -->
  +<A NAME="navbar_bottom"><!-- --></A>
  +<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0">
  +<TR>
  +<TD COLSPAN=3 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
  +<A NAME="navbar_bottom_firstrow"><!-- --></A>
  +<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">
  +  <TR ALIGN="center" VALIGN="top">
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A 
HREF="overview-summary.html"><FONT 
CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class-Group</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT 
CLASS="NavBarFont1">Use</FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT 
CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
  +  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A 
HREF="deprecated-list.html"><FONT 
CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
  +  </TR>
  +</TABLE>
  +
  +</TD>
  +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
  +<b>$distname-$version</b></EM>
  +</TD>
  +</TR>
  +
  +<TR>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +&nbsp;PREV&nbsp;
  +&nbsp;NEXT</FONT></TD>
  +<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
  +  <A HREF="index.html" TARGET="_top"><B>FRAMES</B></A>  &nbsp;
  +&nbsp;<A HREF="overview-tree.html" TARGET="_top"><B>NO FRAMES</B></A>  &nbsp;
  +&nbsp;
  +<SCRIPT>
  +  <!--
  +  if(window==top) {
  +    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All 
Classes</B></A>');
  +  }
  +  //-->
  +</SCRIPT>
  +<NOSCRIPT>
  +<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>
  +</NOSCRIPT>
  +</FONT></TD>
  +</TR>
  +</TABLE>
  +<!-- =========== END OF NAVBAR =========== -->
   
  -#sub write_allclasses {
  -#    my ($html);
  -#    $html = <<EOF;
  -#EOF
  -#    &write_file("$dir/api/allclasses-frame.html", $html);
  -#}
  -
  -#sub write_overview_summary {
  -#    my ($html);
  -#    $html = <<EOF;
  -#EOF
  -#    &write_file("$dir/api/overview-summary.html", $html);
  -#}
  +</BODY>
  +</HTML>
  +EOF
  +
  +    if ($this_class_group eq "allclasses") {
  +        &write_file("$dir/api/overview-tree.html", $html);
  +    }
  +    else {
  +        &write_file("$dir/api/${this_class_group}-tree.html", $html);
  +    }
  +}
  +
  +sub class_group_tree {
  +    my ($class_group) = @_;
  +    my ($class, $class2, $html, $children, $classes, @root_classes, 
%selected_classes);
  +    $html = "";
  +    $classes = $data{classgroup}{$class_group}{classes};
  +    if (defined $classes) {
  +        foreach $class (@$classes) {
  +            while ($data{class}{$class}{parent}) {
  +                $selected_classes{$class} = 1;
  +                $class = $data{class}{$class}{parent};
  +            }
  +            if (! $selected_classes{$class}) {
  +                push(@root_classes, $class);
  +                $selected_classes{$class} = 1;
  +            }
  +        }
  +        foreach $class (@$classes) {
  +            $children = $data{class}{$class}{children};
  +            if (defined $children) {
  +                foreach $class2 (@$children) {
  +                    $selected_classes{$class2} = 1;
  +                }
  +            }
  +        }
  +
  +        $html .= "<ul>\n";
  +        foreach $class (@root_classes) {
  +            $html .= &class_tree($class, \%selected_classes);
  +        }
  +        $html .= "</ul>\n";
  +    }
  +    $html;
  +}
  +
  +sub class_tree {
  +    my ($class, $selected_classes) = @_;
  +    my ($html, $htmlfile, $children, $parents, $parents_text);
  +    $html = "";
  +
  +    $parents = $data{class}{$class}{parents};
  +    $parents_text = "";
  +    if (defined $parents && ref($parents) eq "ARRAY" && $#$parents > -1) {
  +        $parents_text = " (also inherits from " . join(", ", @$parents) . ")";
  +    }
  +
  +    $htmlfile = $data{class}{$class}{podclass};
  +    if ($htmlfile) {
  +        $htmlfile =~ s!::!/!g;
  +        $htmlfile = "../$htmlfile";
  +        $html = "<li type=\"circle\"><a 
href=\"$htmlfile\">$class</a>$parents_text\n";
  +    }
  +    else {
  +        $html = "<li type=\"circle\">$class$parents_text\n";
  +    }
  +    $children = $data{class}{$class}{children};
  +    if (defined $children) {
  +        $html .= "<ul>\n";
  +        foreach $class (@$children) {
  +            if (!defined $selected_classes || !%$selected_classes || 
$selected_classes->{$class}) {
  +                $html .= &class_tree($class);
  +            }
  +        }
  +        $html .= "</ul>\n";
  +    }
  +    $html;
  +}
   
   #############################################################################
   # Utility functions
  
  
  


Reply via email to