stas        2003/01/26 20:05:13

  Modified:    src/docs/2.0/api config.cfg
               src/docs/2.0/user/compat compat.pod
               src/docs/2.0/user/config custom.pod
               src/docs/2.0/user/handlers http.pod
               src/docs/2.0/user/intro overview.pod start_fast.pod
  Added:       src/docs/2.0/api/APR PerlIO.pod Table.pod
               src/docs/2.0/api/Apache Log.pod Reload.pod RequestRec.pod
                        ServerUtil.pod SubProcess.pod compat.pod
               src/docs/2.0/api/ModPerl PerlRun.pod Registry.pod
                        RegistryBB.pod RegistryCooker.pod
                        RegistryLoader.pod
  Removed:     src/docs/2.0/api/ModPerl-Registry/ModPerl PerlRun.pod
                        Registry.pod RegistryBB.pod RegistryCooker.pod
                        RegistryLoader.pod
               src/docs/2.0/api/mod_perl-2.0 .cvsignore Makefile.PL
               src/docs/2.0/api/mod_perl-2.0/APR PerlIO.pod Table.pod
               src/docs/2.0/api/mod_perl-2.0/Apache Log.pod Reload.pod
                        RequestRec.pod ServerUtil.pod SubProcess.pod
                        compat.pod
  Log:
  drop the extra sub-dirs ModPerl-Registry and mod_perl-2.0, we can control
  what goes where programmatically if needed. In any case registry is a part
  of the core
  
  Revision  Changes    Path
  1.12      +13 -13    modperl-docs/src/docs/2.0/api/config.cfg
  
  Index: config.cfg
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/config.cfg,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- config.cfg        8 Nov 2002 04:10:36 -0000       1.11
  +++ config.cfg        27 Jan 2003 04:05:12 -0000      1.12
  @@ -15,27 +15,27 @@
   
       group    => 'Apache::',
       chapters => [qw(
  -        mod_perl-2.0/Apache/Log.pod
  -        mod_perl-2.0/Apache/Reload.pod
  -        mod_perl-2.0/Apache/RequestRec.pod
  -        mod_perl-2.0/Apache/ServerUtil.pod
  -        mod_perl-2.0/Apache/SubProcess.pod
  -        mod_perl-2.0/Apache/compat.pod
  +        Apache/Log.pod
  +        Apache/Reload.pod
  +        Apache/RequestRec.pod
  +        Apache/ServerUtil.pod
  +        Apache/SubProcess.pod
  +        Apache/compat.pod
       )],
   
       group    => 'APR::',
       chapters => [qw(
  -        mod_perl-2.0/APR/PerlIO.pod
  -        mod_perl-2.0/APR/Table.pod
  +        APR/PerlIO.pod
  +        APR/Table.pod
       )],
   
       group    => 'ModPerl::',
       chapters => [qw(
  -        ModPerl-Registry/ModPerl/PerlRun.pod
  -        ModPerl-Registry/ModPerl/Registry.pod
  -        ModPerl-Registry/ModPerl/RegistryBB.pod
  -        ModPerl-Registry/ModPerl/RegistryCooker.pod
  -        ModPerl-Registry/ModPerl/RegistryLoader.pod
  +        ModPerl/PerlRun.pod
  +        ModPerl/Registry.pod
  +        ModPerl/RegistryBB.pod
  +        ModPerl/RegistryCooker.pod
  +        ModPerl/RegistryLoader.pod
       )],
   
   
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/APR/PerlIO.pod
  
  Index: PerlIO.pod
  ===================================================================
  =head1 NAME
  
  APR:PerlIO -- An APR Perl IO layer
  
  =head1 SYNOPSIS
  
    use APR::PerlIO ();
    
    sub handler {
        my $r = shift;
    
        open my $fh, ">:APR", $filename, $r or die $!;
        # work with $fh as normal $fh
        close $fh;
    
        return Apache::OK;
    }
  
  =head1 DESCRIPTION
  
  C<APR::PerlIO> implements a Perl IO layer using APR's file
  manipulation as its internals.
  
  Why do you want to use this? Normally you shouldn't, probably it won't
  be faster than Perl's default layer. It's only useful when you need to
  manipulate a filehandle opened at the APR side, while using Perl.
  
  Normally you won't call open() with APR layer attribute, but some
  mod_perl functions will return a filehandle which is internally hooked
  to APR. But you can use APR Perl IO directly if you want.
  
  =head1 METHODS
  
  Perl Interface:
  
  =over
  
  =item open()
  
  To use APR Perl IO to open a file the four arguments open() should be
  used. For example:
  
    open my $fh, ">:APR", $filename, $r or die $!;
  
  where:
  
  the second argument is the mode to open the file, constructed from two
  sections separated by the C<:> character: the first section is the
  mode to open the file under (E<gt>, E<lt>, etc) and the second section
  must be a string I<APR>.
  
  the fourth argument can be a C<Apache::RequestRec> or
  C<Apache::ServerRec> object.
  
  the rest of the arguments are the same as described by the I<open()>
  manpage.
  
  =item seek()
  
    seek($fh, $offset, $whence);
  
  If C<$offset> is zero, C<seek()> works normally.
  
  However if C<$offset> is non-zero and Perl has been compiled with with
  large files support (C<-Duselargefiles>), whereas APR wasn't, this
  function will croak. This is because largefile size C<Off_t> simply
  cannot fit into a non-largefile size C<apr_off_t>.
  
  To solve the problem, rebuild Perl with C<-Uuselargefiles>. Currently
  there is no way to force APR to build with large files support.
  
  =back
  
  The C interface provides functions to convert between Perl IO and
  APR Perl IO filehandles.
  
  =head1 SEE ALSO
  
  The I<perliol(1)>, I<perlapio(1)> and I<perl(1)> manpages.
  
  =cut
  
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/APR/Table.pod
  
  Index: Table.pod
  ===================================================================
  =head1 NAME
  
  APR::Table -- A Perl API for manipulating opaque string-content table
  
  =head1 SYNOPSIS
  
    use APR::Table;
    
    $table = make($pool, $nelts);
    $table_copy = $table->copy($pool);
    
    $table->clear();
    
    $table->set($key => $val);
    $table->unset($key);
    $table->add($key, $val);
    
    $val = $table->get($key);
    @val = $table->get($key);
    
    $table->merge($key => $val);
    overlap($table_a, $table_b, $flags);
    $new_table = overlay($table_base, $table_overlay, $pool);
    
    $table->do(sub {print "key $_[0], value $_[1]\n"}, @valid_keys);
    
    #Tied Interface
    $value = $table->{$key};
    $table->{$key} = $value;
    $table->{$key} = $value;
    exists $table->{$key};
    
    foreach my $key (keys %{$table}) {
        print "$key = $table->{$key}\n";
    }
  
  =head1 DESCRIPTION
  
  C<APR::Table> allows its users to manipulate opaque string-content
  tables.
  
  The table's structure is somewhat similar to the Perl's hash
  structure, but allows multiply values for the same key.  An access to
  the records stored in the table always requires a key.
  
  The key-value pairs are stored in the order they are added.
  
  The keys are case-insensitive.
  
  However as of the current implementation if more than value for the
  same key is requested, the whole table is lineary searched, which is
  very inefficient unless the table is very small.
  
  C<APR::Table> provides a L<TIE Interface|/TIE_Interface>.
  
  See I<apr/include/apr_tables.h> in ASF's I<apr> project for low level
  details.
  
  =head1 API
  
  The variables used in the API definition have the following
  I<"types">:
  
  =over
  
  =item * APR::Table
  
  C<$table_*>
  
  =item * APR::Pool
  
  C<$pool>
  
  =item * scalars: unsigned integers only (SVIV) (as C expects them)
  
  C<$nelts>, C<$flags>
  
  =item * scalars: (numerical (SVIV/SVNV) and strings (SVPV))
  
  C<$key>, C<$val>
  
  =back
  
  Function arguments (if any) and return values are shown in the
  function's synopsis.
  
  =over
  
  =item * make()
  
    $table = make($pool, $nelts);
  
  Make a new table.
  
  param C<$pool>: The pool to allocate the pool out of.
  
  param C<$nelts>: The number of elements in the initial table.
  
  return: a new table.
  
  warning: This table can only store text data
  
  =item * copy()
  
    $table_copy = $table->copy($pool);
  
  Create a new table and copy another table into it
  
  param C<$pool>: The pool to allocate the new table out of
  
  param C<$table>: The table to copy
  
  return: A copy of the table passed in
  
  =item * clear()
  
    $table->clear();
  
  Delete all of the elements from a table.
  
  param C<$table>: A copy of the table passed in
  
  =item * set();
  
    $table->set($key => $val);
  
  Add a key/value pair to a table, if another element already exists
  with the same key, this will over-write the old data.
  
  param C<$table>: The table to add the data to.
  
  param C<$key>: The key fo use.
  
  param C<$val>: The value to add.
  
  =item * add()
  
    $table->add($key, $val);
  
  Add data to a table, regardless of whether there is another element
  with the same key.
  
  param C<$table>: The table to add to
  
  param C<$key>: The key to use
  
  param C<$val>: The value to add.
  
  =item * do()
  
    $table->do(sub {[...]}, [EMAIL PROTECTED]);
  
  Iterate over all the elements of the table, invoking provided
  subroutine for each element.  The subroutine gets passed as argument,
  a key-value pair.
  
  The subroutine can abort the iteration by returning 0 and should
  always return 1 otherwise.
  
  param C<sub>: A subroutine reference or name to be called on each item
  in the table
  
  param C<@filter>: Only keys matching one of the entries in the filter
  will be processed
   
  
  
  =item * get()
  
    $val = $table->get($key);
    @val = $table->get($key);
  
  Get the value(s) associated with a given key.
  
  After this call, the data is still in the table.
  
  param C<$table>: The table to search for the key
  
  param C<$key>: The key to search for
  
  return: In the scalar context the first matching value returned. (The
  oldest in the table, if there is more than one value.) In the list
  context the whole table is traversed and all matching values are
  returned. If nothing matches I<undef> is returned.
  
  =item * unset();
  
    $table->unset($key);
  
  Remove data from the table
  
  param C<$table>: The table to remove data from
  
  param C<$key>: The key of the data being removed
  
  
  =item * merge()
  
    $table->merge($key => $val);
  
  Add data to a table by merging the value with data that has already
  been stored
  
  param C<$table>: The table to search for the data
  
  param C<$key>: The key to merge data for
  
  param C<$val>: The data to add
  
  remark: If the key is not found, then this function acts like add()
  
  =item * overlap()
  
    overlap($table_a, $table_b, $flags);
  
  For each key/value pair in C<$table_b>, add the data to
  C<$table_a>. The definition of C<$flags> explains how C<$flags> define
  the overlapping method.
  
  param C<$table_a>: The table to add the data to.
  
  param C<$table_b>: The table to iterate over, adding its data to
  C<%table_a>.
  
  param C<$flags>: How to add the C<$table_b> to C<$table_a>.
  
  When C<$flags> == C<APR_OVERLAP_TABLES_SET>, if another element
  already exists with the same key, this will over-write the old data.
  
  When C<$flags> == C<APR_OVERLAP_TABLES_MERGE>, the key/value pair from
  C<$table_b> is added, regardless of whether there is another element
  with the same key in C<$table_a>.
  
  remark: This function is highly optimized, and uses less memory and
  CPU cycles than a function that just loops through table b calling
  other functions.
  
  =item * overlay()
  
    $new_table = overlay($table_base, $table_overlay, $pool);
  
  Merge two tables into one new table. The resulting table may have more
  than one value for the same key.
  
  param C<$pool>: The pool to use for the new table
  
  param C<$table_overlay>: The first table to put in the new table
  
  param C<$table_base>: The table to add at the end of the new table
  
  return: A new table containing all of the data from the two passed in
  
  =back
  
  =head2 TIE Interface
  
  C<APR::Table> also implements a tied interface, so you can work with the
  C<$table> object as a hash reference.
  
  The following tied-hash function are supported: FETCH, STORE, DELETE,
  CLEAR, EXISTS, FIRSTKEY, NEXTKEY and DESTROY.
  
  remark: C<APR::Table> can hold more than one key-value pair sharing
  the same key, so when using a table through the tied interface, the
  first entry found with the right key will be used, completely
  disregarding possible other entries with the same key.  The only
  exception to this is if you iterate over the list with I<each>, then
  you can access all key-value pairs that share the same key.
  
  
  
  =cut
  
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/Log.pod
  
  Index: Log.pod
  ===================================================================
  =head1 NAME
  
  Apache::Log -- Perl API for Apache Logging Methods
  
  
  
  =head1 Synopsis
  
    #in startup.pl
    #-------------
    use Apache::Log;
    my $s = Apache->server;
    
    $s->log_error("server: log_error");
    $s->log_serror(Apache::LOG_MARK, Apache::LOG_ERR,
                   0, "log_serror logging at err level");
    $s->log_serror(Apache::LOG_MARK, Apache::LOG_DEBUG,
                   APR::ENOTIME, "debug print");
    Apache::Server->log_error("routine warning");
    
    Apache->warn("routine warning");
    Apache::warn("routine warning");
    Apache::Server->warn("routine warning");
  
    #in a handler
    #------------
    use Apache::Log;
    sub handler{
        my $r = shift;
        $r->log_error("request: log_error");
        $r->warn("whoah!");
    
        my $rlog = $r->log;
        for my $level qw(emerg alert crit error warn notice info debug) {
            no strict 'refs';
            $rlog->$level($package, "request: $level log level");
        }
    
        # can use server methods as well
        my $s = $r->server;
        $s->log_error("server: log_error");
    
        $r->log_rerror(Apache::LOG_MARK, Apache::LOG_DEBUG,
                       APR::ENOTIME, "in debug");
    
        $s->log_serror(Apache::LOG_MARK, Apache::LOG_INFO, 0,
                       "server info");
    
        $s->log_serror(Apache::LOG_MARK, Apache::LOG_ERR,
                       APR::ENOTIME, "fatal error");
  
        $s->warn('routine server warning');
    }
  
  
  
  =head1 Description
  
  C<Apache::Log> provides the Perl API for Apache logging methods.
  
  
  
  
  =head1 Constants
  
  The following constants (sorted from the most severe level to the
  least severe) are used in logging methods to specify the log level at
  which the message should be logged:
  
  =over 
  
  =item * C<Apache::LOG_EMERG>
  
  =item * C<Apache::LOG_ALERT>
  
  =item * C<Apache::LOG_CRIT>
  
  =item * C<Apache::LOG_ERR>
  
  =item * C<Apache::LOG_WARNING>
  
  =item * C<Apache::LOG_NOTICE>
  
  =item * C<Apache::LOG_INFO>
  
  =item * C<Apache::LOG_DEBUG>
  
  =back
  
  For example if the current C<LogLevel> is set to I<warning>, only
  messages with log level of the level I<warning> or higher (I<err>,
  I<crit>, I<elert> and I<emerg>) will be logged. Therefore this:
  
    $r->log_rerror(Apache::LOG_MARK, Apache::LOG_WARNING,
                   APR::ENOTIME, "warning!");
  
  will log the message, but this one won't:
  
    $r->log_rerror(Apache::LOG_MARK, Apache::LOG_INFO,
                   APR::ENOTIME, "just an info");
  
  It will be logged only if the server log level is set to I<info> or
  I<debug>. (either in the configuration file or using the
  C<$s-E<gt>loglevel()> method.)
  
  Other constants:
  
  =over 
  
  =item * C<Apache::LOG_LEVELMASK>
  
  used to mask off the level value, to make sure that the log level's
  value is within the proper bits range. e.g.:
  
   $loglevel &= LOG_LEVELMASK;
  
  =item * C<Apache::LOG_TOCLIENT>
  
  used to give content handlers the option of including the error text
  in the C<ErrorDocument> sent back to the client. When
  C<Apache::LOG_TOCLIENT> is passed to C<log_rerror()> the error message
  will be saved in the C<$r>'s notes table, keyed to the string
  I<"error-notes">, if and only if the severity level of the message is
  C<Apache::LOG_WARNING> or greater and there are no other
  I<"error-notes"> entry already set in the request record's notes
  table. Once the I<"error-notes"> entry is set, it is up to the error
  handler to determine whether this text should be sent back to the
  client.  For example:
  
    $r->log_rerror(Apache::LOG_MARK, Apache::LOG_ERR|Apache::LOG_TOCLIENT,
                   APR::ENOTIME, "request log_rerror");
  
  now the log message can be retrieved via:
  
    $r->notes->get("error-notes");
  
  Remember that client generated text streams sent back to the client
  MUST be escaped to prevent CSS attacks.
  
  =item * C<Apache::LOG_STARTUP>
  
  is set only during the startup.
  
  =back
  
  
  
  
  
  
  
  =head1 Server Logging Methods
  
  =head2 C<$s-E<gt>log_error()>
  
    $s->log_error(@message);
  
  just logs the supplied message. For example:
  
    $s->log_error("running low on memory");
  
  =head2 C<$s-E<gt>log_serror()>
  
    log_serror($file, $line, $level, $status, @message);
  
  where:
  
   * $file    The file in which this function is called
   * $line    The line number on which this function is called
   * $level   The level of this error message
   * $status  The status code from the previous command
   * @message The log message
  
  This function provides a fine control of when the message is logged,
  gives an access to built-in status codes.
  
  For example:
  
    $s->log_serror(Apache::LOG_MARK, Apache::LOG_ERR,
                   0, "log_serror logging at err level");
    
    $s->log_serror(Apache::LOG_MARK, Apache::LOG_DEBUG,
                   APR::ENOTIME, "debug print");
  
  =head2 C<$s-E<gt>log()>
  
    my $slog = $s->log;
  
  returns a handle which can be used to log messages of different
  level. See the next entry.
  
  =head2 emerg(), alert(), crit(), error(), warn(), notice(), info(), debug()
  
    $s->log->emerg(@message);
  
  after getting the log handle with C<$s-E<gt>log>, use these methods to
  control when messages should be logged.
  
  For example:
  
    my $slog = $s->log;
    $slog->debug("just ", "some debug info");
    $slog->warn(@warnings);
    $slog->crit("dying");
  
  
  
  
  
  
  
  =head1 Request Logging Methods
  
  =head2 C<$r-E<gt>log_error()>
  
    $r->log_error(@message);
  
  logs the supplied message (similar to C<$s-E<gt>log_error>). For
  example:
  
    $r->log_error("the request is about to end");
  
  the same as C<$s-E<gt>log_error>.
  
  =head2 C<$r-E<gt>log_rerror()>
  
    log_rerror($file, $line, $level, $status, @message);
  
  same as C<$s-E<gt>log_rerror>. For example:
  
    $s->log_rerror(Apache::LOG_MARK, Apache::LOG_ERR,
                   0, "log_rerror logging at err level");
    
    $s->log_rerror(Apache::LOG_MARK, Apache::LOG_DEBUG,
                   APR::ENOTIME, "debug print");
  
  =head2 C<$r-E<gt>log()>
  
    my $rlog = $r->log;
  
  Similar to C<$s-E<gt>log()>
  
  =head2 the emerg(), alert(), crit(), error(), warn(), notice(), info(), 
debug() methods
  
  Similar to the server's log functions with the same names.
  
  For example:
  
    $rlog->debug("just ", "some debug info");
    $rlog->warn(@req_warnings);
    $rlog->crit("dying");
  
  
  
  
  =head1 General Functions
  
  =head2 C<Apache::LOG_MARK()>
  
    my($file, $line) = Apache::LOG_MARK();
  
  Though looking like a constant, this is a function, which returns a
  list of two items: C<(__FILE__, __LINE__)>, i.e. the file and the line
  where the function was called from.
  
  
  
  
  
  
  =head1 Aliases
  
  =head2 C<$s-E<gt>warn()>
  
    $s->warn(@warnings);
  
  is the same as:
  
    $s->log_error(Apache::LOG_MARK, Apache::LOG_WARNING, 0, @warnings)
  
  For example:
  
    $s->warn('routine server warning');
  
  =head2 C<Apache-E<gt>warn()>
  
  =head2 C<Apache::warn()>
  
    Apache->warn(@warnings);
  
  
  
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/Reload.pod
  
  Index: Reload.pod
  ===================================================================
  =head1 NAME
  
  Apache::Reload - Reload Perl Modules when Changed on Disk
  
  =head1 Synopsis
  
    # Monitor and reload all modules in %INC:
    # httpd.conf:
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
  
    # Reload groups of modules:
    # httpd.conf:
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
    PerlSetVar ReloadAll Off
    PerlSetVar ReloadModules "ModPerl::* Apache::*"
    #PerlSetVar ReloadDebug On
  
    # Reload a single module from within itself:
    package My::Apache::Module;
    use Apache::Reload;
    sub handler { ... }
    1;
  
  =head1 Description
  
  C<Apache::Reload> reloads modules that change on the disk.
  
  When Perl pulls a file via C<require>, it stores the filename in the
  global hash C<%INC>.  The next time Perl tries to C<require> the same
  file, it sees the file in C<%INC> and does not reload from disk.  This
  module's handler can be configured to iterate over the modules in
  C<%INC> and reload those that have changed on disk or only specific
  modules that have registered themselves with C<Apache::Reload>. It can
  also do the check for modified modules, when a special touch-file has
  been modified.
  
  Note that C<Apache::Reload> operates on the current context of
  C<@INC>.  Which means, when called as a C<Perl*Handler> it will not
  see C<@INC> paths added or removed by C<Apache::Registry> scripts, as
  the value of C<@INC> is saved on server startup and restored to that
  value after each request.  In other words, if you want
  C<Apache::Reload> to work with modules that live in custom C<@INC>
  paths, you should modify C<@INC> when the server is started.  Besides,
  C<'use lib'> in the startup script, you can also set the C<PERL5LIB>
  variable in the httpd's environment to include any non-standard 'lib'
  directories that you choose.  For example, to accomplish that you can
  include a line:
  
    PERL5LIB=/home/httpd/perl/extra; export PERL5LIB
  
  in the script that starts Apache. Alternatively, you can set this
  environment variable in I<httpd.conf>:
  
    PerlSetEnv PERL5LIB /home/httpd/perl/extra
  
  =head2 Monitor All Modules in C<%INC>
  
  To monitor and reload all modules in C<%INC>, simply add the following
  configuration to your I<httpd.conf>:
  
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
  
  =head2 Register Modules Implicitly
  
  To only reload modules that have registered with C<Apache::Reload>,
  add the following to the I<httpd.conf>:
  
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
    PerlSetVar ReloadAll Off
    # ReloadAll defaults to On
  
  Then any modules with the line:
  
    use Apache::Reload;
  
  Will be reloaded when they change.
  
  =head2 Register Modules Explicitly
  
  You can also register modules explicitly in your I<httpd.conf> file
  that you want to be reloaded on change:
  
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
    PerlSetVar ReloadAll Off
    PerlSetVar ReloadModules "My::Foo My::Bar Foo::Bar::Test"
  
  Note that these are split on whitespace, but the module list B<must>
  be in quotes, otherwise Apache tries to parse the parameter list.
  
  The C<*> wild character can be used to register groups of files under
  the same namespace. For example the setting:
  
    PerlSetVar ReloadModules "ModPerl::* Apache::*"
  
  will monitor all modules under the namespaces C<ModPerl::> and
  C<Apache::>.
  
  =head2 Monitor Only Certain Sub Directories
  
  To reload modules only in certain directories (and their
  subdirectories) add the following to the I<httpd.conf>:
  
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
    PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2"
  
  You can further narrow the list of modules to be reloaded from the
  chosen directories with C<ReloadModules> as in:
  
    PerlModule Apache::Reload
    PerlInitHandler Apache::Reload
    PerlSetVar ReloadDirectories "/tmp/project1 /tmp/project2"
    PerlSetVar ReloadAll Off
    PerlSetVar ReloadModules "MyApache::*"
  
  In this configuration example only modules from the namespace
  C<MyApache::> found in the directories I</tmp/project1/> and
  I</tmp/project2/> (and their subdirectories) will be reloaded.
  
  =head2 Special "Touch" File
  
  You can also declare a file, which when gets C<touch(1)>ed, causes the
  reloads to be performed. For example if you set:
  
    PerlSetVar ReloadTouchFile /tmp/reload_modules
  
  and don't C<touch(1)> the file I</tmp/reload_modules>, the reloads
  won't happen until you go to the command line and type:
  
    % touch /tmp/reload_modules
  
  When you do that, the modules that have been changed, will be
  magically reloaded on the next request. This option works with any
  mode described before.
  
  =head1 Performance Issues
  
  This modules is perfectly suited for a development environment. Though
  it's possible that you would like to use it in a production
  environment, since with C<Apache::Reload> you don't have to restart
  the server in order to reload changed modules during software
  updates. Though this convenience comes at a price:
  
  =over
  
  =item *
  
  If the "touch" file feature is used, C<Apache::Reload> has to stat(2)
  the touch file on each request, which adds a slight but most likely
  insignificant overhead to response times. Otherwise C<Apache::Reload>
  will stat(2) each registered module or even worse--all modules in
  C<%INC>, which will significantly slow everything down.
  
  =item *
  
  Once the child process reloads the modules, the memory used by these
  modules is not shared with the parent process anymore. Therefore the
  memory consumption may grow significantly.
  
  =back
  
  Therefore doing a full server stop and restart is probably a better
  solution.
  
  =head1 Debug
  
  If you aren't sure whether the modules that are supposed to be
  reloaded, are actually getting reloaded, turn the debug mode on:
  
    PerlSetVar ReloadDebug On
  
  =head1 Problems With Reloading Modules Which Do Not Declare Their Package Name
  
  If you modify modules which don't declare their C<package> and rely on
  C<Apache::Reload> to reload them you may encounter problems: i.e.,
  it'll appear as if the module wasn't reloaded when in fact it
  was. This happens because when C<Apache::Reload> C<require()>s such a
  module all the global symbols end up in the C<Apache::Reload>
  namespace!  So the module does get reloaded and you see the compile
  time errors if there are any, but the symbols don't get imported to
  the right namespace. Therefore the old version of the code is running.
  
  =head1 Threaded MPM and Multiple Perl Interpreters
  
  If you use C<Apache::Reload> with a threaded MPM and multiple Perl
  interpreters, the modules will be reloaded by each interpreter as they
  are used, not every interpreters at once.  Similar to mod_perl 1.0
  where each child has its own Perl interpreter, the modules are
  reloaded as each child is hit with a request.
  
  If a module is loaded at startup, the syntax tree of each subroutine
  is shared between interpreters (big win), but each subroutine has its
  own padlist (where lexical my variables are stored).  Once
  C<Apache::Reload> reloads a module, this sharing goes away and each
  Perl interpreter will have its own copy of the syntax tree for the
  reloaded subroutines.
  
  
  =head1 Pseudo-hashes
  
  The short summary of this is: Don't use pseudo-hashes. They are
  deprecated since Perl 5.8 and are removed in 5.9.
  
  Use an array with constant indexes. Its faster in the general case,
  its more guaranteed, and generally, it works.
  
  The long summary is that some work has been done to get this module
  working with modules that use pseudo-hashes, but it's still broken in
  the case of a single module that contains multiple packages that all
  use pseudo-hashes.
  
  So don't do that.
  
  =head1 Authors
  
  Matt Sergeant, [EMAIL PROTECTED]
  
  Stas Bekman (porting to mod_perl 2.0)
  
  A few concepts borrowed from C<Stonehenge::Reload> by Randal Schwartz
  and C<Apache::StatINC> (mod_perl 1.x) by Doug MacEachern and Ask
  Bjoern Hansen.
  
  =head1 See Also
  
  C<Stonehenge::Reload>
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/RequestRec.pod
  
  Index: RequestRec.pod
  ===================================================================
  =head1 NAME
  
  Apache::RequestRec -- A Perl API for Apache request object
  
  =head1 SYNOPSIS
  
    use Apache::RequestRec;
    sub handler{
        my $r = shift;
        
        my $s = $r->server;
        my $dir_config = $r->dir_config;
        ...
    }
  
  =head1 DESCRIPTION
  
  C<Apache::RequestRec> provides the Perl API for Apache request object.
  
  =head1 API
  
  Function arguments (if any) and return values are shown in the
  function's synopsis.
  
  =over
  
  =item * server()
  
    $s = $r->server;
  
  Gets the C<Apache::Server> object for the server the request C<$r> is
  running under.
  
  =item * dir_config()
  
  dir_config() provides an interface for the per-directory variable
  specified by the C<PerlSetVar> and C<PerlAddVar> directives, and also
  can be manipulated via the C<APR::Table> methods.
  
  The keys are case-insensitive.
  
    $apr_table = $r->dir_config();
  
  dir_config() called in a scalar context without the C<$key> argument
  returns a I<HASH> reference blessed into the I<APR::Table> class. This
  object can be manipulated via the I<APR::Table> methods. For available
  methods see I<APR::Table>.
  
    @values = $r->dir_config($key);
  
  If the C<$key> argument is passed in the list context a list of all
  matching values will be returned. This method is ineffective for big
  tables, as it does a linear search of the table. Thefore avoid using
  this way of calling dir_config() unless you know that there could be
  more than one value for the wanted key and all the values are wanted.
  
    $value = $r->dir_config($key);
  
  If the C<$key> argument is passed in the scalar context only a single
  value will be returned. Since the table preserves the insertion order,
  if there is more than one value for the same key, the oldest value
  assosiated with the desired key is returned. Calling in the scalar
  context is also much faster, as it'll stop searching the table as soon
  as the first match happens.
  
    $r->dir_config($key => $val);
  
  If the C<$key> and the C<$val> arguments are used, the set() operation
  will happen: all existing values associated with the key C<$key> (and
  the key itself) will be deleted and C<$value> will be placed instead.
  
    $r->dir_config($key => undef);
  
  If C<$val> is I<undef> the unset() operation will happen: all existing
  values associated with the key C<$key> (and the key itself) will be
  deleted.
  
  =item *
  
  =back
  
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/ServerUtil.pod
  
  Index: ServerUtil.pod
  ===================================================================
  =head1 NAME
  
  Apache::ServerUtil -- Methods for work with Apache::Server object
  
  =head1 SYNOPSIS
  
    use Apache::ServerUtil;
    
    $s = Apache->server;
    my $srv_cfg = $s->dir_config;
  
    # get 'conf/' dir path using $r
    my $conf_dir = Apache::server_root_relative('conf', $r->pool);
  
    # get 'log/' dir path using default server startup pool
    my $log_dir = Apache::server_root_relative('log');
  
  =head1 DESCRIPTION
  
  C<Apache::ServerUtil> provides the Perl API for Apache server object.
  
  META: complete
  
  =head1 API
  
  Function arguments (if any) and return values are shown in the
  function's synopsis.
  
  =head2 CONSTANTS
  
  =over
  
  =item * server_root
  
  returns the value set by the C<ServerRoot> directive.
  
  =back
  
  =head2 FUNCTIONS
  
  =over
  
  =item * server_root_relative()
  
  Returns the canonical form of the filename made absolute to
  C<ServerRoot>:
  
    Apache::server_root_relative($pool, $fname);
  
  C<$fname> is appended to the value of C<ServerRoot> and return
  it. e.g.:
  
    my $log_dir = Apache::server_root_relative($r->pool, 'logs');
  
  If C<$fname> is not specified, the value of C<ServerRoot> is returned
  with a trailing C</>. (it's the same as using C<''> as C<$fname>'s
  value).
  
  Also see the C<server_root> constant.
  
  =back
  
  =head2 METHODS
  
  =over
  
  =item * server()
  
  The main server's object can be retrieved with:
  
    $s = Apache->server;
  
  Gets the C<Apache::Server> object for the main server.
  
  =item * dir_config()
  
  dir_config() provides an interface for the per-server variables
  specified by the C<PerlSetVar> and C<PerlAddVar> directives, and also
  can be manipulated via the C<APR::Table> methods.
  
  The keys are case-insensitive.
  
    $t = $s->dir_config();
  
  dir_config() called in a scalar context without the C<$key> argument
  returns a I<HASH> reference blessed into the I<APR::Table> class. This
  object can be manipulated via the I<APR::Table> methods. For available
  methods see I<APR::Table>.
  
    @values = $s->dir_config($key);
  
  If the C<$key> argument is passed in the list context a list of all
  matching values will be returned. This method is ineffective for big
  tables, as it does a linear search of the table. Thefore avoid using
  this way of calling dir_config() unless you know that there could be
  more than one value for the wanted key and all the values are wanted.
  
    $value = $s->dir_config($key);
  
  If the C<$key> argument is passed in the scalar context only a single
  value will be returned. Since the table preserves the insertion order,
  if there is more than one value for the same key, the oldest value
  assosiated with the desired key is returned. Calling in the scalar
  context is also much faster, as it'll stop searching the table as soon
  as the first match happens.
  
    $s->dir_config($key => $val);
  
  If the C<$key> and the C<$val> arguments are used, the set() operation
  will happen: all existing values associated with the key C<$key> (and
  the key itself) will be deleted and C<$value> will be placed instead.
  
    $s->dir_config($key => undef);
  
  If C<$val> is I<undef> the unset() operation will happen: all existing
  values associated with the key C<$key> (and the key itself) will be
  deleted.
  
  =item * push_handlers()
  
  =item * add_handlers()
  
  =item * get_handlers()
  
  
  =back
  
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/SubProcess.pod
  
  Index: SubProcess.pod
  ===================================================================
  =head1 NAME
  
  Apache::SubProcess -- Executing SubProcesses from mod_perl
  
  =head1 SYNOPSIS
  
    use Apache::SubProcess ();
    
    use Config;
    use constant PERLIO_IS_ENABLED => $Config{useperlio};
    
    # pass @ARGV / read from the process
    $command = "/tmp/argv.pl";
    @argv = qw(foo bar);
    $out_fh = Apache::SubProcess::spawn_proc_prog($r, $command, [EMAIL 
PROTECTED]);
    $output = read_data($out_fh);
    
    # pass environment / read from the process
    $command = "/tmp/env.pl";
    $r->subprocess_env->set(foo => "bar");
    $out_fh = Apache::SubProcess::spawn_proc_prog($r, $command);
    $output = read_data($out_fh);
    
    # write to/read from the process
    $command = "/tmp/in_out_err.pl";
    ($in_fh, $out_fh, $err_fh) = 
        Apache::SubProcess::spawn_proc_prog($r, $command);
    print $in_fh "hello\n";
    $output = read_data($out_fh);
    $error  = read_data($err_fh);
    
    # helper function to work w/ and w/o perlio-enabled Perl
    sub read_data {
        my($fh) = @_;
        my $data;
        if (PERLIO_IS_ENABLED || IO::Select->new($fh)->can_read(10)) {
            $data = <$fh>;
        }
        return defined $data ? $data : '';
    }
  
  =head1 DESCRIPTION
  
  C<Apache::SubProcess> provides the Perl API for running and
  communicating with processes spawned from mod_perl handlers.
  
  =head1 API
  
  =head2 spawn_proc_prog()
  
    $out_fh = 
        Apache::SubProcess::spawn_proc_prog($r, $command, [EMAIL PROTECTED]);
    ($in_fh, $out_fh, $err_fh) = 
        Apache::SubProcess::spawn_proc_prog($r, $command, [EMAIL PROTECTED]);
  
  spawn_proc_prog() spawns a sub-process which exec()'s C<$command> and
  returns the output pipe filehandle in the scalar context, or input,
  output and error pipe filehandles in the list context. Using these
  three pipes it's possible to communicate with the spawned process.
  
  The third optional argument is a reference to an array which if passed
  becomes ARGV to the spawned program.
  
  It's possible to pass environment variables as well, by calling:
  
    $r->subprocess_env->set($key => $value);
  
  before spawning the subprocess.
  
  There is an issue with reading from the read filehandle (C<$in_fh>)):
  
  A pipe filehandle returned under perlio-disabled Perl needs to call
  select() if the other end is not fast enough to send the data, since
  the read is non-blocking.
  
  A pipe filehandle returned under perlio-enabled Perl on the other hand
  does the select() internally, because it's really a filehandle opened
  via C<:APR> layer, which internally uses APR to communicate with the
  pipe. The way APR is implemented Perl's select() cannot be used with
  it (mainly because select() wants fileno() and APR is a crossplatform
  implementation which hides the internal datastructure).
  
  Therefore to write a portable code, you want to use select for
  perlio-disabled Perl and do nothing for perlio-enabled Perl, hence you
  can use something similar to the read_data() wrapper shown in the
  L<SYNOPSIS|/SYNOPSIS> section.
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/Apache/compat.pod
  
  Index: compat.pod
  ===================================================================
  =head1 NAME
  
  Apache::compat -- 1.0 backward compatibility functions deprecated in 2.0
  
  =head1 SYNOPSIS
  
    use Apache::compat;
  
  =head1 DESCRIPTION
  
  C<Apache::compat> provides mod_perl 1.0 compatibility layer.
  
  It includes most of the functions that are deprecated in mod_perl
  2.0. If your code uses any of these functions you should just load
  this module at the server startup, and chances are that everything
  should work as it did in 1.0.
  
  However, certain functionality is not optimized and therefore it's the
  best to try to port your code not to use deprecated functions and stop
  using the compatibility layer.
  
  =head1 API
  
  META: complete
  
  Function arguments (if any) and return values are shown in the
  function's synopsis.
  
  =over
  
  =item * $r-E<gt>header_in()
  
    $r->header_in( $header_name, [$value] )
  
  Return the value of a client header:
  
     $ct = $r->header_in($key);
  
  Set or modify the value of a client header:
  
     $r->header_in($key, $val);
  
  =item * $r-E<gt>header_out()
  
    $r->header_out( $header, $value )
  
  Return the value of a response header:
  
     $ct = $r->header_out($key);
  
  Set or modify the value of a response header:
  
     $r->header_out($key, $val);
  
  You should not define any I<"Content-XXX"> headers by calling this
  method, because these headers use their own specific methods.
  
  =item *
  
  =back
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/ModPerl/PerlRun.pod
  
  Index: PerlRun.pod
  ===================================================================
  =head1 NAME
  
  ModPerl::PerlRun - Run unaltered CGI scripts under mod_perl
  
  =head1 SYNOPSIS
  
  =head1 DESCRIPTION
  
  =head1 AUTHORS
  
  Doug MacEachern
  
  Stas Bekman
  
  =head1 SEE ALSO
  
  ModPerl::RegistryCooker(3), Apache(3), mod_perl(3)
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/ModPerl/Registry.pod
  
  Index: Registry.pod
  ===================================================================
  =head1 NAME
  
  ModPerl::Registry - Run unaltered CGI scripts persistently under mod_perl
  
  =head1 Synopsis
  
    # httpd.conf
    PerlModule ModPerl::Registry
    Alias /perl/ /home/httpd/perl/
    <Location /perl>
        SetHandler perl-script
        PerlResponseHandler ModPerl::Registry
        #PerlOptions +ParseHeaders
        #PerlOptions -GlobalRequest
        Options +ExecCGI
    </Location>
  
  =head1 Description
  
  URIs in the form of C<http://example.com/perl/test.pl> will be
  compiled as the body of a Perl subroutine and executed.  Each child
  process will compile the subroutine once and store it in memory. It
  will recompile it whenever the file (e.g. I<test.pl> in our example)
  is updated on disk.  Think of it as an object oriented server with
  each script implementing a class loaded at runtime.
  
  The file looks much like a "normal" script, but it is compiled into a
  subroutine.
  
  For example:
  
    my $r = Apache->request;
    $r->content_type("text/html");
    $r->send_http_header;
    $r->print("mod_perl rules!");
  
  XXX: STOPPED here
  
  META: document that for now we don't chdir() into the script's dir,
  because it affects the whole process under threads.
  
  
  This module emulates the CGI environment, allowing programmers to
  write scripts that run under CGI or mod_perl without change.  Existing
  CGI scripts may require some changes, simply because a CGI script has
  a very short lifetime of one HTTP request, allowing you to get away
  with "quick and dirty" scripting.  Using mod_perl and Apache::Registry
  requires you to be more careful, but it also gives new meaning to the
  word "quick"!
  
  Be sure to read all mod_perl related documentation for more details,
  including instructions for setting up an environment that looks
  exactly like CGI:
  
   print "Content-type: text/html\n\n";
   print "Hi There!";
  
  Note that each httpd process or "child" must compile each script once,
  so the first request to one server may seem slow, but each request
  there after will be faster.  If your scripts are large and/or make use
  of many Perl modules, this difference should be noticeable to the
  human eye.
  
  =head1 SECURITY
  
  Apache::Registry::handler will preform the same checks as mod_cgi
  before running the script.
  
  =head1 ENVIRONMENT
  
  The Apache function `exit' overrides the Perl core built-in function.
  
  The environment variable B<GATEWAY_INTERFACE> is set to C<CGI-Perl/1.1>.
  
  =head1 COMMANDLINE SWITCHES IN FIRST LINE
  
  Normally when a Perl script is run from the command line or under CGI,
  arguments on the `#!' line are passed to the perl interpreter for processing.
  
  Apache::Registry currently only honors the B<-w> switch and will turn
  on warnings using the C<$^W> global variable.  Another common switch
  used with CGI scripts is B<-T> to turn on taint checking.  This can
  only be enabled when the server starts with the configuration
  directive:
  
   PerlTaintCheck On
  
  However, if taint checking is not enabled, but the B<-T> switch is seen,
  Apache::Registry will write a warning to the error_log.
  
  =head1 DEBUGGING
  
  You may set the debug level with the $Apache::Registry::Debug bitmask
  
   1 => log recompile in errorlog
   2 => Apache::Debug::dump in case of $@
   4 => trace pedantically
  
  =head1 CAVEATS
  
  Apache::Registry makes things look just the CGI environment, however, you
  must understand that this *is not CGI*.  Each httpd child will compile
  your script into memory and keep it there, whereas CGI will run it once,
  cleaning out the entire process space.  Many times you have heard
  "always use C<-w>, always use C<-w> and 'use strict'".
  This is more important here than anywhere else!
  
  Your scripts cannot contain the __END__ or __DATA__ token to terminate
  compilation.
  
  
  =head1 Authors
  
  Andreas J. Koenig, Doug MacEachern and Stas Bekman.
  
  =head1 See Also
  
  C<L<ModPerl::RegistryCooker>>, C<L<ModPerl::RegistryBB>>,
  C<L<ModPerl::PerlRun>>, Apache(3), mod_perl(3)
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/ModPerl/RegistryBB.pod
  
  Index: RegistryBB.pod
  ===================================================================
  =head1 NAME
  
  ModPerl::RegistryBB - Run unaltered CGI scripts persistently under mod_perl
  
  =head1 Synopsis
  
    # httpd.conf
    PerlModule ModPerl::RegistryBB
    Alias /perl/ /home/httpd/perl/
    <Location /perl>
        SetHandler perl-script
        PerlResponseHandler ModPerl::RegistryBB
        #PerlOptions +ParseHeaders
        #PerlOptions -GlobalRequest
        Options +ExecCGI
    </Location>
  
  =head1 Description
  
  C<ModPerl::RegistryBB> is similar to C<L<ModPerl::Registry>>, but does
  the bare minimum (mnemonic: BB = Bare Bones) to compile a script file
  once and run it many times, in order to get the maximum
  performance. Whereas C<L<ModPerl::Registry>> does various checks,
  which add a slight overhead to response times.
  
  =head1 Authors
  
  Doug MacEachern
  
  Stas Bekman
  
  =head1 See Also
  
  C<L<ModPerl::RegistryCooker>>, C<L<ModPerl::Registry>>, Apache(3),
  mod_perl(3)
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/ModPerl/RegistryCooker.pod
  
  Index: RegistryCooker.pod
  ===================================================================
  =head1 NAME
  
  ModPerl::RegistryCooker - Cook mod_perl 2.0 Registry Modules
  
  =head1 Synopsis
  
    # shouldn't be used as-is but sub-classed first
    # see ModPerl::Registry for an example
  
  =head1 Description
  
  C<ModPerl::RegistryCooker> is used to create flexible and overridable
  registry modules which emulate mod_cgi for Perl scripts. The concepts
  are discussed in the manpage of the following modules:
  C<L<ModPerl::Registry>>, C<L<ModPerl::Registry>> and
  C<L<ModPerl::RegistryBB>>.
  
  C<ModPerl::RegistryCooker> has two purposes:
  
  =over
  
  =item *
  
  Provide ingredients that can be used by registry sub-classes
  
  =item *
  
  Provide a default behavior, which can be overriden in sub-classed
  
  META: in the future this functionality may move into a separate class.
  
  =back
  
  Here are the current overridable methods:
  
  META: these are all documented in RegistryCooker.pm, though not using
  pod. please help to port these to pod and move the descriptions here.
  
  =over
  
  =item * new()
  
  create the class's object, bless it and return it
  
    my $obj = $class->new($r);
  
  C<$class> -- the registry class, usually C<__PACKAGE__> can be used.
  
  C<$r> -- C<L<Apache::Request>> object.
  
  default: new()
  
  =item * init()
  
  initializes the data object's fields: C<REQ>, C<FILENAME>,
  C<URI>. Called from the new().
  
  default: init()
  
  =item * default_handler()
  
  default:  default_handler()
  
  =item * run()
  
  default: run()
  
  =item * can_compile()
  
  default: can_compile()
  
  =item * make_namespace()
  
  default: make_namespace()
  
  =item * namespace_root()
  
  default: namespace_root()
  
  
  =item * namespace_from()
  
  If C<namespace_from_uri> is used and the script is called from the
  virtual host, by default the virtual host name is prepended to the uri
  when package name for the compiled script is created. Sometimes this
  behavior is undesirable, e.g., when the same (physical) script is
  accessed using the same path_info but different virtual hosts. In that
  case you can make the script compiled only once for all vhosts, by
  specifying:
  
    $ModPerl::RegistryCooker::NameWithVirtualHost = 0;
  
  The drawback is that it affects the global environment and all other
  scripts will be compiled ignoring virtual hosts.
  
  default: namespace_from()
  
  =item * is_cached()
  
  default: is_cached()
  
  =item * should_compile()
  
  default: should_compile()
  
  =item * flush_namespace()
  
  default: flush_namespace()
  
  
  =item * cache_table()
  
  default: cache_table()
  
  =item * cache_it()
  
  default: cache_it()
  
  =item * read_script()
  
  default: read_script()
  
  =item * rewrite_shebang()
  
  default: rewrite_shebang()
  
  =item * set_script_name()
  
  default: set_script_name()
  
  =item * chdir_file()
  
  default: chdir_file()
  
  =item * get_mark_line()
  
  default: get_mark_line()
  
  =item * compile()
  
  default: compile()
  
  
  =item * error_check()
  
  default: error_check()
  
  =item * strip_end_data_segment()
  
  default: strip_end_data_segment()
  
  =item * convert_script_to_compiled_handler()
  
  default: convert_script_to_compiled_handler()
  
  =back
  
  
  
  
  =head2 Special Predefined Functions
  
  The following functions are implemented as constants.
  
  =over
  
  =item * NOP()
  
  Use when the function shouldn't do anything.
  
  =item * TRUE()
  
  Use when a function should always return a true value.
  
  =item * FALSE()
  
  Use when a function should always return a false value.
  
  =back
  
  
  
  
  =head1 Sub-classing Techniques
  
  To override the default C<ModPerl::RegistryCooker> methods, first,
  sub-class C<ModPerl::RegistryCooker> or one of its existing
  sub-classes, using C<use base>. Second, override the methods.
  
  Those methods that weren't overridden will be resolved at run time
  when used for the first time and cached for the future requests. One
  way to to shortcut this first run resolution is to use the symbol
  aliasing feature. For example to alias C<ModPerl::MyRegistry::flush_namespace>
  as C<ModPerl::RegistryCooker::flush_namespace>, you can do:
  
    package ModPerl::MyRegistry;
    use base qw(ModPerl::RegistryCooker);
    *ModPerl::MyRegistry::flush_namespace =
        \&ModPerl::RegistryCooker::flush_namespace;
    1;
  
  In fact, it's a good idea to explicitly alias all the methods so you
  know exactly what functions are used, rather then relying on the
  defaults. For that purpose C<ModPerl::RegistryCooker> class method
  install_aliases() can be used. Simply prepare a hash with method names
  in the current package as keys and corresponding fully qualified
  methods to be aliased for as values and pass it to
  install_aliases(). Continuing our example we could do:
  
    package ModPerl::MyRegistry;
    use base qw(ModPerl::RegistryCooker);
    my %aliases = (
        flush_namespace => 'ModPerl::RegistryCooker::flush_namespace',
    );
    __PACKAGE__->install_aliases(\%aliases);
    1;
  
  The values use fully qualified packages so you can mix methods from
  different classes.
  
  =head1 Examples
  
  The best examples are existing core registry modules:
  C<L<ModPerl::Registry>>, C<L<ModPerl::Registry>> and
  C<L<ModPerl::RegistryBB>>. Look at the source code and their manpages
  to see how they subclass C<ModPerl::RegistryCooker>.
  
  For example by default C<L<ModPerl::Registry>> uses the script's path
  when creating a package's namespace. If for example you want to use a
  uri instead you can override it with:
  
    *ModPerl::MyRegistry::namespace_from =
        \&ModPerl::RegistryCooker::namespace_from_uri;
    1;
  
  Since the C<namespace_from_uri> component already exists in
  C<ModPerl::RegistryCooker>. If you want to write your own method,
  e.g., that creates a namespace based on the inode, you can do:
  
    sub namespace_from_inode {
        my $self = shift;
        return (stat $self->[FILENAME])[1];
    }
  
  META: when $r-E<gt>finfo will be ported it'll be more effecient. 
  (stat $r-E<gt>finfo)[1]
  
  
  =head1 Authors
  
  Doug MacEachern
  
  Stas Bekman
  
  =head1 See Also
  
  C<L<ModPerl::Registry>>, C<L<ModPerl::RegistryBB>>,
  C<L<ModPerl::PerlRun>>, Apache(3), mod_perl(3)
  
  =cut
  
  
  
  1.1                  modperl-docs/src/docs/2.0/api/ModPerl/RegistryLoader.pod
  
  Index: RegistryLoader.pod
  ===================================================================
  =head1 NAME
  
  ModPerl::RegistryLoader - Compile ModPerl::RegistryCooker scripts at server 
startup
  
  =head1 Synopsis
  
    # in startup.pl
    use ModPerl::RegistryLoader ();
    
    # explicit uri => filename mapping 
    my $rlbb = ModPerl::RegistryLoader->new(
        package => 'ModPerl::RegistryBB',
        debug   => 1, # default 0
    );
  
    $rlbb->handler($uri, $filename);
    
    ###
    # uri => filename mapping using a helper function
    sub trans {
        my $uri = shift; 
        $uri =~ s|^/registry/|cgi-bin/|;
        return Apache::server_root_relative($uri);
    }
    my $rl = ModPerl::RegistryLoader->new(
        package => 'ModPerl::Registry',
        trans   => \&trans,
    );
    $rl->handler($uri);
    
    ###
    $rlbb->handler($uri, $filename, $virtual_hostname);
  
  
  =head1 Description
  
  This modules allows compilation of scripts, running under packages
  derived from C<ModPerl::RegistryCooker>, at server startup.  The
  script's handler routine is compiled by the parent server, of which
  children get a copy and thus saves some memory by initially sharing
  the compiled copy with the parent and saving the overhead of script's
  compilation on the first request in every httpd instance.
  
  This module is of course useless for those running the
  C<L<ModPerl::PerlRun>> handler, because the scripts get recompiled on
  each request under this handler.
  
  =head1 Methods
  
  =over
  
  =item new()
  
  When creating a new C<ModPerl::RegistryLoader> object, one has to
  specify which of the C<ModPerl::RegistryCooker> derived modules to
  use. For example if a script is going to run under
  C<ModPerl::RegistryBB> the object is initialized as:
  
    my $rlbb = ModPerl::RegistryLoader->new(
        package => 'ModPerl::RegistryBB',
    );
  
  If the package is not specified C<ModPerl::Registry> is assumed:
  
    my $rlbb = ModPerl::RegistryLoader->new();
  
  To turn the debugging on, set the I<debug> attribute to a true value:
  
    my $rlbb = ModPerl::RegistryLoader->new(
        package => 'ModPerl::RegistryBB',
        debug   => 1,
    );
  
  Instead of specifying explicitly a filename for each uri passed to
  handler(), a special attribute I<trans> can be set to a subroutine to
  perform automatic remapping.
  
    my $rlbb = ModPerl::RegistryLoader->new(
        package => 'ModPerl::RegistryBB',
        trans   => \&trans,
    );
  
  See the handler() item for an example of using the I<trans> attribute.
  
  =item handler()
  
    $rl->handler($uri, [$filename, [$virtual_hostname]]);
  
  The handler() method takes argument of C<uri> and optionally of
  C<filename> and of C<virtual_hostname>.
  
  URI to filename translation normally doesn't happen until HTTP request
  time, so we're forced to roll our own translation. If the filename is
  supplied it's used in translation.
  
  If the filename is omitted and a C<trans> subroutine was not set in
  new(), the loader will try using the C<uri> relative to the
  C<ServerRoot> configuration directive.  For example:
  
    httpd.conf:
    -----------
    ServerRoot /usr/local/apache
    Alias /registry/ /usr/local/apache/cgi-bin/
  
    startup.pl:
    -----------
    use ModPerl::RegistryLoader ();
    my $rl = ModPerl::RegistryLoader->new(
        package => 'ModPerl::Registry',
    );
    # preload /usr/local/apache/cgi-bin/test.pl
    $rl->handler(/registry/test.pl);
  
  To make the loader smarter about the URI-E<gt>filename translation,
  you may provide the C<new()> method with a C<trans()> function to
  translate the uri to filename.
  
  The following example will pre-load all files ending with I<.pl> in
  the I<cgi-bin> directory relative to C<ServerRoot>.
  
    httpd.conf:
    -----------
    ServerRoot /usr/local/apache
    Alias /registry/ /usr/local/apache/cgi-bin/
  
    startup.pl:
    -----------
    {
        # test the scripts pre-loading by using trans sub
        use ModPerl::RegistryLoader ();
        use DirHandle ();
        use strict;
    
        my $dir = Apache::server_root_relative("cgi-bin");
    
        sub trans {
            my $uri = shift; 
            $uri =~ s|^/registry/|cgi-bin/|;
            return Apache::server_root_relative($uri);
        }
    
        my $rl = ModPerl::RegistryLoader->new(
            package => "ModPerl::Registry",
            trans   => \&trans,
        );
        my $dh = DirHandle->new($dir) or die $!;
    
        for my $file ($dh->read) {
            next unless $file =~ /\.pl$/;
            $rl->handler("/registry/$file");
        }
    }
  
  If C<$virtual_hostname> argument is passed it'll be used in the
  creation of the package name the script will be compiled into for
  those registry handlers that use I<namespace_from_uri()> method.  See
  also the notes on C<$ModPerl::RegistryCooker::NameWithVirtualHost> in
  the C<L<ModPerl::RegistryCooker>> documentation.
  
  Also
  explained in the C<L<ModPerl::RegistryLoader>> documentation, this
  only has an effect at run time if
  C<$ModPerl::RegistryCooker::NameWithVirtualHost> is set to true,
  otherwise the C<$virtual_hostname> argument is ignored.
  
  =back
  
  
  =head1 Implementation Notes
  
  C<ModPerl::RegistryLoader> performs a very simple job, at run time it
  loads and sub-classes the module passed via the I<package> attribute
  and overrides some of its functions, to emulate the run-time
  environment. This allows to preload the same script into different
  registry environments.
  
  =head1 Authors
  
  The original C<Apache::RegistryLoader> implemented by Doug MacEachern.
  
  Stas Bekman did the porting to the new registry framework based on
  C<ModPerl::RegistryLoader>.
  
  =head1 SEE ALSO
  
  C<L<ModPerl::RegistryCooker>>, C<L<ModPerl::Registry>>,
  C<L<ModPerl::RegistryBB>>, C<L<ModPerl::PerlRun>>, Apache(3),
  mod_perl(3)
  
  
  
  1.41      +19 -19    modperl-docs/src/docs/2.0/user/compat/compat.pod
  
  Index: compat.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/compat/compat.pod,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- compat.pod        16 Jan 2003 01:06:43 -0000      1.40
  +++ compat.pod        27 Jan 2003 04:05:13 -0000      1.41
  @@ -203,15 +203,15 @@
   
   =over
   
  -=item C<L<Apache::Const|docs::2.0::api::mod_perl-2.0::Apache::Const>>
  +=item C<L<Apache::Const|docs::2.0::api::Apache::Const>>
   
   Apache constants
   
  -=item C<L<APR::Const|docs::2.0::api::mod_perl-2.0::APR::Const>>
  +=item C<L<APR::Const|docs::2.0::api::APR::Const>>
   
   Apache Portable Runtime constants
   
  -=item C<L<ModPerl::Const|docs::2.0::api::mod_perl-2.0::ModPerl::Const>>
  +=item C<L<ModPerl::Const|docs::2.0::api::ModPerl::Const>>
   
   mod_perl specific constants
   
  @@ -314,7 +314,7 @@
   C<Apache::ServerUtil>.
   
   See the
  -C<L<Apache::ServerUtil|docs::2.0::api::mod_perl-2.0::Apache::ServerUtil>>
  +C<L<Apache::ServerUtil|docs::2.0::api::Apache::ServerUtil>>
   manpage.
   
   =head2 C<Apache::exit()>
  @@ -324,7 +324,7 @@
   argument: status, whose default is 0 (== do nothing).
   
   See the
  -C<L<ModPerl::Util|docs::2.0::api::mod_perl-2.0::ModPerl::Util>>
  +C<L<ModPerl::Util|docs::2.0::api::ModPerl::Util>>
   manpage.
   
   =head2 C<Apache::gensym()>
  @@ -351,7 +351,7 @@
     Apache->server->log_error
   
   instead. See the
  -C<L<Apache::Log|docs::2.0::api::mod_perl-2.0::Apache::Log>> manpage.
  +C<L<Apache::Log|docs::2.0::api::Apache::Log>> manpage.
   
   
   =head1 C<Apache::Server::> Methods and Variables
  @@ -383,7 +383,7 @@
   where the last argument C<$data> is optional, and if supplied will be
   passed as the first argument to the callback function.
   
  -See the C<L<APR::Pool|docs::2.0::api::mod_perl-2.0::APR::Pool>> manpage.
  +See the C<L<APR::Pool|docs::2.0::api::APR::Pool>> manpage.
   
   
   
  @@ -400,7 +400,7 @@
   
   C<$r-E<gt>lookup_file> and C<$r-E<gt>lookup_uri> didn't change their
   functionality but moved into
  -C<L<Apache::SubRequest|docs::2.0::api::mod_perl-2.0::Apache::SubRequest>>.
  +C<L<Apache::SubRequest|docs::2.0::api::Apache::SubRequest>>.
   Before using them, add:
   
     use Apache::SubRequest;
  @@ -408,7 +408,7 @@
   =head2 C<$r-E<gt>get_remote_host>
   
   C<$r-E<gt>get_remote_host> has been renamed and moved into the package
  -C<L<Apache::Connection|docs::2.0::api::mod_perl-2.0::Apache::Connection>>:
  +C<L<Apache::Connection|docs::2.0::api::Apache::Connection>>:
   
     use Apache::Connection;
     $r->connection->get_remote_host();
  @@ -461,7 +461,7 @@
   =back
   
   Instead you should use C<Apache::Request>'s C<params()> and similar
  -methods to do the parsing for you. See the 
C<L<Apache::Request|docs::2.0::api::mod_perl-2.0::Apache::Request>>
  +methods to do the parsing for you. See the 
C<L<Apache::Request|docs::2.0::api::Apache::Request>>
   manpage.
   
   XXX: ...when Apache::Request will be ported to 2.0. For now you can
  @@ -523,12 +523,12 @@
   
   C<$r-E<gt>log_reason> is not available in mod_perl 2.0 API. Use the
   other standard logging functions provided by the
  -C<L<Apache::Log|docs::2.0::api::mod_perl-2.0::Apache::Log>>
  +C<L<Apache::Log|docs::2.0::api::Apache::Log>>
   module. For example:
   
     $r->log_error("it works!");
   
  -See the C<L<Apache::Log|docs::2.0::api::mod_perl-2.0::Apache::Log>>
  +See the C<L<Apache::Log|docs::2.0::api::Apache::Log>>
   manpage.
   
   
  @@ -650,32 +650,32 @@
   =head2 C<discard_request_body()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   =head2 C<meets_conditions()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   =head2 C<set_content_length()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   =head2 C<set_etag()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   =head2 C<set_last_modified()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   =head2 C<update_mtime()>
   
   This function now belongs to the module
  -C<L<Apache::Response|docs::2.0::api::mod_perl-2.0::Apache::Response>>.
  +C<L<Apache::Response|docs::2.0::api::Apache::Response>>.
   
   
   
  @@ -691,7 +691,7 @@
   C<Apache::Util::size_string()> has been replaced with
   C<APR::String::format_size()>, which returns formatted strings of only
   4 characters long. See the
  -C<L<APR::String|docs::2.0::api::mod_perl-2.0::APR::String>> manpage.
  +C<L<APR::String|docs::2.0::api::APR::String>> manpage.
   
   =head2 C<Apache::Util::escape_uri()>
   
  
  
  
  1.4       +7 -7      modperl-docs/src/docs/2.0/user/config/custom.pod
  
  Index: custom.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/config/custom.pod,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- custom.pod        13 Dec 2002 17:50:29 -0000      1.3
  +++ custom.pod        27 Jan 2003 04:05:13 -0000      1.4
  @@ -203,7 +203,7 @@
   appear. There are L<several
   constants|/Directive_Scope_Definition_Constants> which map onto the
   corresponding Apache macros. These constants should be imported from
  -the C<L<Apache::Const|docs::2.0::api::mod_perl-2.0::Apache::Const>>
  +the C<L<Apache::Const|docs::2.0::api::Apache::Const>>
   package.
   
   For example, to use the C<OR_ALL> constant, which allows directives to
  @@ -232,7 +232,7 @@
   Apache validate that the number of arguments is valid, the I<args_how>
   attribute should be set to the desired value. Similar to the
   I<L<req_override|/C_req_override_>> attribute, the
  -C<L<Apache::Const|docs::2.0::api::mod_perl-2.0::Apache::Const>>
  +C<L<Apache::Const|docs::2.0::api::Apache::Const>>
   package provides special constants which map to the corresponding
   Apache macros.  There are L<several
   constants|/Directive_Syntax_Definition_Constants> to choose from.
  @@ -406,14 +406,14 @@
   =item 2
   
   C<$parms> is an
  -C<L<Apache::CmdParms|docs::2.0::api::mod_perl-2.0::Apache::CmdParms>>
  +C<L<Apache::CmdParms|docs::2.0::api::Apache::CmdParms>>
   object from which you can retrieve various other information about the
   configuration. For example to retrieve the server object:
   
     my $s = $parms->server;
   
   See
  -C<L<Apache::CmdParms|docs::2.0::api::mod_perl-2.0::Apache::CmdParms>>
  +C<L<Apache::CmdParms|docs::2.0::api::Apache::CmdParms>>
   for more information.
   
   =item 3
  @@ -431,7 +431,7 @@
   The following values of the I<L<args_how|/C_args_how_>> attribute
   define how many arguments and what kind of arguments directives can
   accept. These values are constants that can be imported from the
  -C<L<Apache::Const|docs::2.0::api::mod_perl-2.0::Apache::Const>>
  +C<L<Apache::Const|docs::2.0::api::Apache::Const>>
   package. For example:
   
     use Apache::Const -compile => qw(TAKE1 TAKE23);
  @@ -668,7 +668,7 @@
   each virtual host defined in I<httpd.conf>. It's called with two
   arguments: C<$class>, the package name it was created in and C<$parms>
   the already familiar
  -C<L<Apache::CmdParms|docs::2.0::api::mod_perl-2.0::Apache::CmdParms>>
  +C<L<Apache::CmdParms|docs::2.0::api::Apache::CmdParms>>
   object. The object is expected to return a reference to a blessed
   hash, which will be used by configuration directives callbacks to set
   the values assigned in the configuration file. But it's possible to
  @@ -781,7 +781,7 @@
   
   The only difference in the retrieving the directory configuration
   object. Here the third argument C<$r-E<gt>per_dir_config> tells
  -C<L<Apache::Module|docs::2.0::api::mod_perl-2.0::Apache::Module>> to
  +C<L<Apache::Module|docs::2.0::api::Apache::Module>> to
   get the directory configuration object.
   
   =head3 C<DIR_MERGE>
  
  
  
  1.11      +3 -3      modperl-docs/src/docs/2.0/user/handlers/http.pod
  
  Index: http.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/http.pod,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- http.pod  10 Jan 2003 04:26:57 -0000      1.10
  +++ http.pod  27 Jan 2003 04:05:13 -0000      1.11
  @@ -466,9 +466,9 @@
   C<L<RUN_ALL|docs::2.0::user::handlers::intro/item_RUN_ALL>>.
   
   The best example here would be to use
  -C<L<Apache::Reload|docs::2.0::api::mod_perl-2.0::Apache::Reload>>
  +C<L<Apache::Reload|docs::2.0::api::Apache::Reload>>
   which takes the benefit of this directive. Usually
  -C<L<Apache::Reload|docs::2.0::api::mod_perl-2.0::Apache::Reload>> is
  +C<L<Apache::Reload|docs::2.0::api::Apache::Reload>> is
   configured as:
   
     PerlInitHandler Apache::Reload
  @@ -489,7 +489,7 @@
         Options +ExecCGI
     </Location>
   
  -C<L<Apache::Reload|docs::2.0::api::mod_perl-2.0::Apache::Reload>> will
  +C<L<Apache::Reload|docs::2.0::api::Apache::Reload>> will
   reload the modified modules, only when a request to the I</devel>
   namespace is issued, because C<L<PerlInitHandler|/PerlInitHandler>>
   plays the role of
  
  
  
  1.3       +1 -1      modperl-docs/src/docs/2.0/user/intro/overview.pod
  
  Index: overview.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/intro/overview.pod,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- overview.pod      23 Dec 2002 23:31:22 -0000      1.2
  +++ overview.pod      27 Jan 2003 04:05:13 -0000      1.3
  @@ -405,7 +405,7 @@
   
   For example this allows mod_perl to inter-operate with the APR IO
   layer and even use the APR IO layer in Perl code. See the
  -C<L<APR::PerlIO|docs::2.0::api::mod_perl-2.0::APR::PerlIO>> manpage.
  +C<L<APR::PerlIO|docs::2.0::api::APR::PerlIO>> manpage.
   
   Another example of using the new feature is the extension of the
   C<open()> functionality to create anonymous temporary files via:
  
  
  
  1.10      +1 -1      modperl-docs/src/docs/2.0/user/intro/start_fast.pod
  
  Index: start_fast.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/intro/start_fast.pod,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- start_fast.pod    15 Dec 2002 17:32:04 -0000      1.9
  +++ start_fast.pod    27 Jan 2003 04:05:13 -0000      1.10
  @@ -123,7 +123,7 @@
   If that didn't work check the I<error_log> file.
   
   For more information on the registry scripts refer to the
  -C<L<ModPerl::Registry|docs::2.0::api::ModPerl-Registry::ModPerl::Registry>>
  +C<L<ModPerl::Registry|docs::2.0::api::ModPerl::Registry>>
   manapage. (XXX: on day there will a tutorial on registry, should port
   it from 1.0's docs).
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to