Added missing space in error message
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader.pm
index 4e84da0..aa62e41 100644 (file)
@@ -2,20 +2,17 @@ package DBIx::Class::Schema::Loader;
 
 use strict;
 use warnings;
-use Carp;
-use UNIVERSAL::require;
-
 use base qw/DBIx::Class::Schema/;
 use base qw/Class::Data::Accessor/;
-
-__PACKAGE__->mk_classaccessor('loader');
-
-use vars qw($VERSION);
+use Carp;
+use UNIVERSAL::require;
 
 # Always remember to do all digits for the version even if they're 0
 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
 # brain damage and presumably various other packaging systems too
-$VERSION = '0.01000';
+our $VERSION = '0.02007';
+
+__PACKAGE__->mk_classaccessor('loader');
 
 =head1 NAME
 
@@ -26,17 +23,28 @@ DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
   package My::Schema;
   use base qw/DBIx::Class::Schema::Loader/;
 
+  sub _monikerize {
+      my $name = shift;
+      $name = join '', map ucfirst, split /[\W_]+/, lc $name;
+      $name;
+  }
+
   __PACKAGE__->load_from_connection(
-    dsn                     => "dbi:mysql:dbname",
-    user                    => "root",
-    password                => "",
+    connect_info            => [ "dbi:mysql:dbname",
+                                 "root",
+                                 "mypassword",
+                                 { AutoCommit => 1 },
+                               ],
     additional_classes      => [qw/DBIx::Class::Foo/],
     additional_base_classes => [qw/My::Stuff/],
     left_base_classes       => [qw/DBIx::Class::Bar/],
+    components              => [qw/ResultSetManager/],
+    resultset_components    => [qw/AlwaysRS/],
     constraint              => '^foo.*',
     relationships           => 1,
     options                 => { AutoCommit => 1 }, 
-    inflect                 => { child => 'children' },
+    inflect_map             => { child => 'children' },
+    moniker_map             => \&_monikerize,
     debug                   => 1,
   );
 
@@ -61,8 +69,8 @@ DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
   #   table-to-classname mappings.
   my $classes = $schema1->loader->classes;
 
-  # Use the schema as per normal for L<DBIx::Class::Schema>
-  my $rs = $schema1->resultset($monikers->{table_table})->search(...);
+  # Use the schema as per normal for DBIx::Class::Schema
+  my $rs = $schema1->resultset($monikers->{foo_table})->search(...);
 
 =head1 DESCRIPTION
 
@@ -75,10 +83,24 @@ L<DBIx::Class::Schema::Loader::Generic> for more, and
 L<DBIx::Class::Schema::Loader::Writing> for notes on writing your own
 db-specific subclass for an unsupported db.
 
-This module requires DBIx::Class::Loader 0.5 or later, and obsoletes
-L<DBIx::Class::Loader> for L<DBIx::Class> version 0.5 and later.
+This module requires L<DBIx::Class> 0.05 or later, and obsoletes
+L<DBIx::Class::Loader> for L<DBIx::Class> version 0.05 and later.
 
-=cut
+While on the whole, the bare table definitions are fairly straightforward,
+relationship creation is somewhat heuristic, especially in the choosing
+of relationship types, join types, and relationship names.  The relationships
+generated by this module will probably never be as well-defined as
+hand-generated ones.  Because of this, over time a complex project will
+probably wish to migrate off of L<DBIx::Class::Schema::Loader>.
+
+It is designed more to get you up and running quickly against an existing
+database, or to be effective for simple situations, rather than to be what
+you use in the long term for a complex database/project.
+
+That being said, transitioning your code from a Schema generated by this
+module to one that doesn't use this module should be straightforward and
+painless, so don't shy away from it just for fears of the transition down
+the road.
 
 =head1 METHODS
 
@@ -90,11 +112,25 @@ L<DBIx::Class::Schema::Loader::Generic> documentation.
 
 =cut
 
+# XXX this is DBI-specific, as it peers into the dsn to determine
+# the vendor class to use...
 sub load_from_connection {
     my ( $class, %args ) = @_;
 
-    croak 'dsn argument is required' if ! $args{dsn};
-    my $dsn = $args{dsn};
+    my $dsn;
+
+    if($args{connect_info} && $args{connect_info}->[0]) {
+        $dsn = $args{connect_info}->[0];
+    }
+    elsif($args{dsn}) {
+        warn "dsn argument is deprecated, please use connect_info instead";
+        $dsn = $args{dsn};
+    }
+    else {
+        croak 'connect_info arrayref argument with valid '
+              . 'first element is required';
+    }
+
     my ($driver) = $dsn =~ m/^dbi:(\w*?)(?:\((.*?)\))?:/i;
     $driver = 'SQLite' if $driver eq 'SQLite2';
     my $impl = "DBIx::Class::Schema::Loader::" . $driver;
@@ -106,11 +142,28 @@ sub load_from_connection {
     $args{schema} = $class;
 
     $class->loader($impl->new(%args));
+    $class->loader->load;
 }
 
+=head2 loader
+
+This is an accessor in the generated Schema class for accessing
+the L<DBIx::Class::Schema::Loader::Generic> -based loader object
+that was used during construction.  See the
+L<DBIx::Class::Schema::Loader::Generic> docs for more information
+on the available loader methods there.
+
+=head1 KNOWN BUGS
+
+Aside from relationship definitions being less than ideal in general,
+this version is known not to handle the case of multiple relationships
+between the same pair of tables.  All of the relationship code will
+be overhauled on the way to 0.03, at which time that bug will be
+addressed.
+
 =head1 AUTHOR
 
-Brandon Black, C<bblack@gmail.com>
+Brandon Black, C<blblack@gmail.com>
 
 Based on L<DBIx::Class::Loader> by Sebastian Riedel