Final draft of docs... formatting issues and feedback from others.
Amiri Barksdale at Home [Fri, 16 Apr 2010 19:11:30 +0000 (12:11 -0700)]
.gitignore
lib/DBIx/Class/ResultSource/MultipleTableInheritance.pm
t/01load.t
t/sql/MTITest-0.1-PostgreSQL.sql

index 6282cb1..b701be6 100644 (file)
@@ -1,3 +1,4 @@
+META.yml
 README*
 inc
 blib
index f7468da..a5cb4cf 100644 (file)
@@ -425,16 +425,24 @@ method view_definition () {
 1;
 
 __END__
+
 =head1 NAME
 
-DBIx::Class::ResultSource::MultipleTableInheritance -- Use multiple tables to define your classes 
+DBIx::Class::ResultSource::MultipleTableInheritance
+Use multiple tables to define your classes 
+
+=head1 NOTICE
+
+This only works with PostgreSQL for the moment.
 
 =head1 SYNOPSIS
 
     {
         package MyApp::Schema::Result::Coffee;
 
-        __PACKAGE__->table_class('DBIx::Class::ResultSource::MultipleTableInheritance');
+        __PACKAGE__->table_class(
+            'DBIx::Class::ResultSource::MultipleTableInheritance'
+        );
         __PACKAGE__->table('coffee');
         __PACKAGE__->add_columns(
           "id",
@@ -483,28 +491,31 @@ DBIx::Class::ResultSource::MultipleTableInheritance -- Use multiple tables to de
 
     my $cup = $schema->resultset('Sumatra')->new;
 
-    print STDERR Dumper $cup->columns;
+    print STDERR DwarnS $cup->columns;
 
         $VAR1 = 'id';
         $VAR2 = 'flavor';
         $VAR3 = 'aroma';
 
 
-Inherit from this package and you can make a resultset class from a view, but that's more than a little bit misleading: the result is B<transparently writable>.
-
-This is accomplished through the use of stored procedures that map changes written to the view to changes to the underlying concrete tables.
+Inherit from this package and you can make a resultset class from a view, but
+that's more than a little bit misleading: the result is B<transparently
+writable>.
 
+This is accomplished through the use of stored procedures that map changes
+written to the view to changes to the underlying concrete tables.
 
 =head1 WHY?
 
-In many applications, many classes are subclasses of others. Let's say you have this schema:
+In many applications, many classes are subclasses of others. Let's say you
+have this schema:
 
     # Conceptual domain model
     
     class User {
-            has id,
-            has name,
-            has password
+        has id,
+        has name,
+        has password
     }
 
     class Investor {
@@ -517,9 +528,9 @@ In many applications, many classes are subclasses of others. Let's say you have
 That's redundant. Hold on a sec...
 
     class User {
-            has id,
-            has name,
-            has password
+        has id,
+        has name,
+        has password
     }
 
     class Investor extends User {
@@ -528,7 +539,9 @@ That's redundant. Hold on a sec...
 
 Good idea, but how to put this into code?
 
-One far-too common and absolutely horrendous solution is to have a "checkbox" in your database: a nullable "investor" column, which entails a nullable "dollars" column, in the user table.
+One far-too common and absolutely horrendous solution is to have a "checkbox"
+in your database: a nullable "investor" column, which entails a nullable
+"dollars" column, in the user table.
 
     create table "user" (
         "id" integer not null primary key autoincrement,
@@ -540,7 +553,8 @@ One far-too common and absolutely horrendous solution is to have a "checkbox" in
 
 Let's not discuss that further.
 
-A second, better, solution is to break out the two tables into user and investor:
+A second, better, solution is to break out the two tables into user and
+investor:
 
     create table "user" (
         "id" integer not null primary key autoincrement,
@@ -553,7 +567,9 @@ A second, better, solution is to break out the two tables into user and investor
         "dollars" integer
     );
 
-So that investor's PK is just an FK to the user. We can clearly see the class hierarchy here, in which investor is a subclass of user. In DBIx::Class applications, this second strategy looks like:
+So that investor's PK is just an FK to the user. We can clearly see the class
+hierarchy here, in which investor is a subclass of user. In DBIx::Class
+applications, this second strategy looks like:
     
     my $user_rs = $schema->resultset('User');
     my $new_user = $user_rs->create(
@@ -568,12 +584,15 @@ So that investor's PK is just an FK to the user. We can clearly see the class hi
         dollars => $args->{dollars},
     );
 
-One can cope well with the second strategy, and it seems to be the most popular smart choice.
-
+One can cope well with the second strategy, and it seems to be the most popular
+smart choice.
 
 =head1 HOW?
 
-There is a third strategy implemented here. Make the database do more of the work: hide the nasty bits so we don't have to handle them unless we really want to. It'll save us some typing and it'll make for more expressive code. What if we could do this:
+There is a third strategy implemented here. Make the database do more of the
+work: hide the nasty bits so we don't have to handle them unless we really want
+to. It'll save us some typing and it'll make for more expressive code. What if
+we could do this:
 
     my $new_investor = $schema->resultset('Investor')->create(
         name => $args->{name},
@@ -588,9 +607,13 @@ And have it Just Work? The user...
         password => $args->{password},
     }
 
-should be created behind the scenes, and the use of either user or investor in your code should require no special handling. Deleting and updating $new_investor should also delete or update the user row.
+should be created behind the scenes, and the use of either user or investor
+in your code should require no special handling. Deleting and updating
+$new_investor should also delete or update the user row.
 
-It does. User and investor are both views, their concrete tables abstracted away behind a set of rules and triggers. You would expect the above DBIC create statement to look like this in SQL:
+It does. User and investor are both views, their concrete tables abstracted
+away behind a set of rules and triggers. You would expect the above DBIC
+create statement to look like this in SQL:
 
     INSERT INTO investor ("name","password","dollars") VALUES (...);
 
@@ -599,7 +622,8 @@ But using MTI, it is really this:
     INSERT INTO _user_table ("username","password") VALUES (...);
     INSERT INTO _investor_table ("id","dollars") VALUES (currval('_user_table_id_seq',...) );
 
-For deletes, the triggers fire in reverse, to preserve referential integrity (foreign key constraints). For instance:
+For deletes, the triggers fire in reverse, to preserve referential integrity
+(foreign key constraints). For instance:
 
    my $investor = $schema->resultset('Investor')->find({id => $args->{id}});
    $investor->delete;
@@ -617,7 +641,8 @@ Becomes:
 =item new
 
 
-MTI find the parents, if any, of your resultset class and adds them to the list of parent_sources for the table.
+MTI find the parents, if any, of your resultset class and adds them to the
+list of parent_sources for the table.
 
 
 =item add_additional_parents
@@ -644,7 +669,9 @@ You can also add just one.
 
 =item attach_additional_sources
 
-MTI takes the parents' sources and relationships, creates new DBIx::Class:Table object from them, and registers this as a new, raw, source in the schema, e.g.,
+MTI takes the parents' sources and relationships, creates a new
+DBIx::Class::Table object from them, and registers this as a new, raw, source
+in the schema, e.g.,
 
     use MyApp::Schema;
 
@@ -670,7 +697,12 @@ Matt S. Trout, E<lt>mst@shadowcatsystems.co.ukE<gt>
 
 =head2 CONTRIBUTORS
 
-Docs: Amiri Barksdale, E<lt>amiri@metalabel.comE<gt>
+Amiri Barksdale, E<lt>amiri@metalabel.comE<gt>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2010 the DBIx::Class::ResultSource::MultipleTableInheritance
+L</AUTHOR> and L</CONTRIBUTORS> as listed above.
 
 =head1 LICENSE
 
index 10c4e2e..664c2c5 100644 (file)
@@ -2,7 +2,6 @@ use strict;
 use warnings;
 use lib 't/lib';
 use Test::More qw(no_plan);
-use Data::Dumper; $Data::Dumper::Indent = 1;
 
 BEGIN { use_ok 'MTITest'; }
 
@@ -46,10 +45,3 @@ is_deeply(
   [ qw(id a words b) ],
   'Columns for mti bar now contain those of foo and the mixin: id a words b'
 );
-
-
-#warn Dumper $raw_bar->_columns;
-
-#warn Dumper $raw_bar->_relationships;
-
-#warn Dumper(MTITest->source('JustATable')->_relationships);
index 05effce..755b99d 100644 (file)
@@ -1,6 +1,6 @@
 -- 
 -- Created by SQL::Translator::Producer::PostgreSQL
--- Created on Sun Apr 11 11:56:23 2010
+-- Created on Fri Apr 16 12:05:18 2010
 -- 
 --
 -- Table: just_a_table