use strict;
use warnings;
+no warnings 'uninitialized';
+
+our $VERSION = '0.23';
+
use Carp;
use UNIVERSAL::require;
=head2 Arguments:
-C< CatalystModelName > is the short name for the Catalyst Model class
-being generated (i.e. callable with C< $c->model >
+C<CatalystModelName> is the short name for the Catalyst Model class
+being generated (i.e. callable with C<$c-E<gt>model('CatalystModelName')>).
-C< MyApp::SchemaClass > is the fully qualified classname of your Schema,
+C<MyApp::SchemaClass> is the fully qualified classname of your Schema,
which might or might not yet exist. Note that you should have a good
reason to create this under a new global namespace, otherwise use an
existing top level namespace for your schema class.
-C< create=dynamic > instructs this Helper to generate the named Schema
+C<create=dynamic> instructs this Helper to generate the named Schema
class for you, basing it on L<DBIx::Class::Schema::Loader> (which
means the table information will always be dynamically loaded at
runtime from the database).
-C< create=static > instructs this Helper to generate the named Schema
+C<create=static> instructs this Helper to generate the named Schema
class for you, using L<DBIx::Class::Schema::Loader> in "one shot"
mode to create a standard, manually-defined L<DBIx::Class::Schema>
setup, based on what the Loader sees in your database at this moment.
adapt itself to changes in your database structure. You can edit
the generated classes by hand to refine them.
-C< connect_info > arguments are the same as what
+C<connect_info> arguments are the same as what
DBIx::Class::Schema::connect expects, and are storage_type-specific.
For DBI-based storage, these arguments are the dsn, username,
password, and connect options, respectively. These are optional for
# and a Model which references it:
script/myapp_create.pl model CatalystModelName DBIC::Schema MyApp::SchemaClass create=static dbi:mysql:foodb myuname mypass
+ # Same, but with extra Schema::Loader args (separate multiple values by commas):
+ script/myapp_create.pl model CatalystModelName DBIC::Schema MyApp::SchemaClass create=static db_schema=foodb components=Foo,Bar exclude='^wibble|wobble$' dbi:Pg:dbname=foodb myuname mypass
+
+ # See DBIx::Class::Schema::Loader::Base for list of options
+
# Create a dynamic DBIx::Class::Schema::Loader-based Schema,
# and a Model which references it:
script/myapp_create.pl model CatalystModelName DBIC::Schema MyApp::SchemaClass create=dynamic dbi:mysql:foodb myuname mypass
# in your app config, or [not recommended] in the schema itself).
script/myapp_create.pl model ModelName DBIC::Schema My::SchemaClass
-=head2 METHODS
+=head1 METHODS
-=head3 mk_compclass
+=head2 mk_compclass
=cut
shift @connect_info;
}
+ my %extra_args;
+ while (@connect_info && $connect_info[0] !~ /^dbi:/) {
+ my ($key, $val) = split /=/, shift(@connect_info);
+
+ if ((my @vals = split /,/ => $val) > 1) {
+ $extra_args{$key} = \@vals;
+ } else {
+ $extra_args{$key} = $val;
+ }
+ }
+
if(@connect_info) {
$helper->{setup_connect_info} = 1;
my @helper_connect_info = @connect_info;
$num++;
}
+# Check if we need to be backward-compatible.
+ my $compatible = 0;
+
+ my @schema_pm = split '::', $schema_class;
+ $schema_pm[-1] .= '.pm';
+ my $schema_file = File::Spec->catfile($helper->{base}, 'lib', @schema_pm);
+
+ if (-f $schema_file) {
+ my $schema_code = do { local (@ARGV, $/) = $schema_file; <> };
+ $compatible = 1 if $schema_code =~ /->load_classes/;
+ }
+
+ my @components = $compatible ? () : ('InflateColumn::DateTime');
+
+ if (exists $extra_args{components}) {
+ $extra_args{components} = [ $extra_args{components} ]
+ unless ref $extra_args{components};
+
+ push @components, @{ delete $extra_args{components} };
+ }
+
+ for my $re_opt (qw/constraint exclude/) {
+ $extra_args{$re_opt} = qr/$extra_args{$re_opt}/
+ if exists $extra_args{$re_opt};
+ }
+
+ if (exists $extra_args{moniker_map}) {
+ die "The moniker_map option is not currently supported by this helper, please write your own DBIx::Class::Schema::Loader script if you need it."
+ }
+
make_schema_at(
$schema_class,
- { relationships => 1 },
+ {
+ relationships => 1,
+ (%extra_args ? %extra_args : ()),
+ (!$compatible ? (
+ use_namespaces => 1
+ ) : ()),
+ (@components ? (
+ components => \@components
+ ) : ())
+ },
\@loader_connect_info,
);
}