stas 2002/12/26 23:05:22 Modified: src/docs/2.0/api/ModPerl-Registry/ModPerl Registry.pod RegistryBB.pod RegistryCooker.pod Log: registry docs, work in progress Revision Changes Path 1.3 +5 -1 modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/Registry.pod Index: Registry.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/Registry.pod,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Registry.pod 19 May 2002 09:41:39 -0000 1.2 +++ Registry.pod 27 Dec 2002 07:05:21 -0000 1.3 @@ -11,7 +11,7 @@ SetHandler perl-script PerlResponseHandler ModPerl::Registry #PerlOptions +ParseHeaders - #PerlOptions +GlobalRequest + #PerlOptions -GlobalRequest Options +ExecCGI </Location> @@ -35,6 +35,10 @@ $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 1.3 +1 -1 modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/RegistryBB.pod Index: RegistryBB.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/RegistryBB.pod,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RegistryBB.pod 19 May 2002 09:41:39 -0000 1.2 +++ RegistryBB.pod 27 Dec 2002 07:05:22 -0000 1.3 @@ -11,7 +11,7 @@ SetHandler perl-script PerlResponseHandler ModPerl::RegistryBB #PerlOptions +ParseHeaders - #PerlOptions +GlobalRequest + #PerlOptions -GlobalRequest Options +ExecCGI </Location> 1.3 +197 -0 modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/RegistryCooker.pod Index: RegistryCooker.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/ModPerl-Registry/ModPerl/RegistryCooker.pod,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- RegistryCooker.pod 19 May 2002 09:41:39 -0000 1.2 +++ RegistryCooker.pod 27 Dec 2002 07:05:22 -0000 1.3 @@ -4,7 +4,204 @@ =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: + +=over + +=item * new() + +default: new() + +=item * init() + +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() + +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 + +Special Predefined functions + +=over + +=item * NOP() + +META: compelete + +=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->finfo will be ported it'll be more effecient. (stat +$r->finfo)[1] + =head1 Authors
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]