The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Text::MicroMason::ApacheHandler;

use Apache::Constants;
use Apache::Request;

use Text::MicroMason::Base;

######################################################################

my %configs;

sub handler ($$) {
  my ($package, $r) = @_;

  my $apache = Apache::Request->instance( $r );
  
  my $file = $apache->filename;
  
  # $apache->document_root;
  my $syntax = $apache->dir_config('MicroMasonSyntax') || 'HTMLMason';
  my @mixins = $apache->dir_config->get('MicroMasonMixins');
  my @attrs = $apache->dir_config->get('MicroMasonAttribs');

  my %seen;
  unshift @attrs, ( map "-$_", grep { ! $seen{$_} ++ } ( @mixins, $syntax ) );

  my $config = join ' ', @attrs;

  my $mason = ( $configs{$config} ||= Text::MicroMason::Base->new( @attrs ) );
  
  my $template = $mason->compile( file => $file );
  
  $apache->content_type( 'text/html' );
  # $apache->header_out();
  
  local $Text::MicroMason::Commands::r = $apache;
  print $template->( $apache->param() );
  
  return Apache::Constants::OK();
}

sub configure {
  my $apache = Apache::Request->instance( shift );
  
  my $file = $apache->filename;
  
  # $apache->document_root;
  my $syntax = $apache->dir_config('MicroMasonSyntax') || 'HTMLMason';
  my @mixins = $apache->dir_config->get('MicroMasonMixins');
  my @attrs = $apache->dir_config->get('MicroMasonAttribs');

  my %seen;
  unshift @attrs, ( map "-$_", grep { ! $seen{$_} ++ } ( @mixins, $syntax ) );

  my $config = join ' ', @attrs;

  my $mason = ( $configs{$config} ||= Text::MicroMason::Base->new( @attrs ) );
}

######################################################################

sub translate_params {
  MasonAllowGlobals => [ -AllowGlobals, allow_globals => \$1 ],
  MasonCompRoot => [ -TemplateDir, template_root => \$1 ],
}

######################################################################

1;

__END__

######################################################################

=head1 NAME

Text::MicroMason::ApacheHandler - Use MicroMason from mod_perl


=head1 SYNOPSIS

In your httpd.conf or equivalent Apache configuration file:

  PerlModule Text::MicroMason::ApacheHandler

  <Files *.mm>
    SetHandler perl-script
    PerlHandler Text::MicroMason::ApacheHandler
  </Files>

In your document root or other web-accessible directory:

  <% my $visitor = $r->connection->remote_host(); %>
  <html>
    Hello there <%= $visitor %>! 
    The time is now <%= localtime() %>.
  </html>

=head1 DESCRIPTION

B<Caution:> This module is new, experimental, and incomplete. Not intended for production use. Interface subject to change. If you're interested in this capability, your feedback would be appreciated.

=head2 Configuration

The following configuration parameters are supported:

=over 4

=item MicroMasonSyntax

    PerlSetVar MicroMasonSyntax HTMLMason

Name of the syntax class that will compile the templates. Defaults to HTMLMason.

=item MicroMasonMixins

    PerlAddVar MicroMasonMixins Safe
    PerlAddVar MicroMasonMixins CatchErrors

List of additional mixin classes to be enabled.

=item MicroMasonAttribs

    PerlAddVar MicroMasonAttribs "-AllowGlobals, allow_globals => '$r'"

Allows for any set of attributes to be defined. Mixin names prefaced with a dash can also be included.

=back

=head1 SEE ALSO

For an overview of this templating framework, see L<Text::MicroMason>.

This is a mixin class intended for use with L<Text::MicroMason::Base>.

For distribution, installation, support, copyright and license 
information, see L<Text::MicroMason::Docs::ReadMe>.

=cut