-sub init {
- my $class = shift;
- my $config = $class->config;
- $config->{model} ||= "Apache::MVC::Model::CDBI";
- $config->{view} ||= "Apache::MVC::View::TT";
- $config->{classes} = [ $class->config->{loader}->classes ];
- $config->{display_tables} ||= [ $class->config->{loader}->tables ];
- for my $class (@{$config->{classes}}) {
- no strict 'refs';
- push @{$class."::ISA"}, $class->config->{model};
+1;
+
+=head1 NAME
+
+Apache::MVC - Web front end to a data source
+
+=head1 SYNOPSIS
+
+ package BeerDB;
+ use base 'Apache::MVC';
+ sub handler { Apache::MVC::handler("BeerDB", @_) }
+ BeerDB->set_database("dbi:mysql:beerdb");
+ BeerDB->config->{uri_base} = "http://your.site/";
+ BeerDB->config->{display_tables} = [qw[beer brewery pub style]];
+ # Now set up your database:
+ # has-a relationships
+ # untaint columns
+
+ 1;
+
+=head1 DESCRIPTION
+
+A large number of web programming tasks follow the same sort of pattern:
+we have some data in a datasource, typically a relational database. We
+have a bunch of templates provided by web designers. We have a number of
+things we want to be able to do with the database - create, add, edit,
+delete records, view records, run searches, and so on. We have a web
+server which provides input from the user about what to do. Something in
+the middle takes the input, grabs the relevant rows from the database,
+performs the action, constructs a page, and spits it out.
+
+This module aims to be the most generic and extensible "something in the
+middle".
+
+An example would help explain this best. You need to add a product
+catalogue to a company's web site. Users need to list the products in
+various categories, view a page on each product with its photo and
+pricing information and so on, and there needs to be a back-end where
+sales staff can add new lines, change prices, and delete out of date
+records. So, you set up the database, provide some default templates
+for the designers to customize, and then write an Apache handler like
+this:
+
+ package ProductDatabase;
+ use base 'Apache::MVC';
+ __PACKAGE__->set_database("dbi:mysql:products");
+ BeerDB->config->{uri_base} = "http://your.site/catalogue/";
+ ProductDatabase::Product->has_a("category" => ProductDatabase::Category);
+ # ...
+
+ sub authenticate {
+ my ($self, $request) = @_;
+ return OK if $request->{ar}->get_remote_host() eq "sales.yourcorp.com";
+ return OK if $request->{action} =~ /^(view|list)$/;
+ return DECLINED;