#####################
# Registry Features #
#####################

- port Apache::PerlRunXS

- replace the local implementation of finfo() when ported to mod_perl 2.0

- $r->chdir_file is not handled/implemented, see todo/api.txt unsafe!

- $Apache::Server::CWD doesn't exist

- need to figure out what's happening with
  ModPerl::Registry::MarkLine, why it's not on by default?

- a cousin of convert_script_to_compiled_handler() in 1.x used to have
  'undef &{"$o->[PACKAGE]\::handler"}' to avoid redefine handler()
  warnings in case a user has used -w. also see the undef_functions on
  the next line.

- child_terminate is not implemented see
  convert_script_to_compiled_handler().

- print STDERR is buffered in test handlers, whereas warn() works
  normally. select() helps, but STDERR should be unbuffered in first
  place.

- in namespace_from_filename() should test whether a file is a symlink
  and if so use readlink() to get the real filename.

- documentation

- acl support via 'filetest qw(access)'. It was decided that having
  this feature by default will be too expensive, because of the
  overhead it adds. The solution was to add a sub-class that will
  provide that functionality. It wasn't decided whether it'll be in
  the core or should live on CPAN. Also it wasn't decided whether
  RegistryCooker should provide the necessary implementation
  callbacks. See:
  http://marc.theaimsgroup.com/?t=107636627000001&r=1&w=2

### optimizations ###

- currently the default is to strip __DATA__|__END__ and everything
  after that, which incurs a little overhead because of the s/// on
  the contents of the file. This "feature" wasn't in 1.x, so may
  consider to make it optional.

### nice to have ###

- Bjarni R. Einarsson <bre@klaki.net> has suggested this Registry hack
  http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=98961929702745&w=2
  Message-ID: <20010511221101.A20868@diskordiah.mmedia.is>

- the closure issue:
  there was a suggestion from raptor to use goto() to leave the code
  unwrapped in the sub handler, which will solve the closure problem,
  but the problem is that once you leave a subroutine with goto() you
  cannot return, because you aren't in the sub anymore.

  barrie has suggested a different approach, which requires adding
  special tags to the script which help to parse the code, and shuffle
  things around without putting subs inside the 'sub handler', but
  this requires a lot of code understanding from a user, and if its
  gained it's probably easier to fix the script so closure effect
  won't happen. However barrie's suggestion can be easily added, by
  overriding convert_script_to_compiled_handler().

- global variables persistance: could have the cooker option to flush
  globals in the autogenerated package at the end of each
  request. (not packages use()'d from this package)

- could also try to privide an optional workaround for the problem
  with libs collisions as explained here:
  http://perl.apache.org/docs/1.0/guide/porting.html#Name_collisions_with_Modules_and

- It's a known kludge with mod_perl scripts coming from mod_cgi which
  use -M for file mtime comparisons, but are not aware of the fact
  that $^T is not getting reset on each request. So may be the cooker
  should have an option to reset $^T on each request.

- develop a cooker() that cooks/modifies a registry package based on
  PerlSetVar variables. So for example a user can modify a behavior of
  an existing package (stat/donotstat...) and giving it a new name at
  the same time. Kinda flag-based inheritance.

* protect registry classes from bad scripts which try to assassinate $r
  Report: http://marc.theaimsgroup.com/?l=apache-modperl-dev&m=106153785129782&w=2
  Status: (stas) i'm not sure whether we really need this feature,
          since it's the first time in the last 6 years we had a
          problem with bad user code of this kind. let's keep it in
          the patches until we have a real need for it.
  Priority: very low

