X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema.pm;h=cea821ab60564013f5b73f9de29ad20d0cc55ea7;hb=a6b68a60b376e918a6058f37cb1115ba3163a59b;hp=0600bf2f3092c9bedd42bcb11145e9efa4b80ca3;hpb=ef131d82b1a6cad5ef079a341912b0c6d8b7b990;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 0600bf2..cea821a 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -5,7 +5,7 @@ use warnings; use DBIx::Class::Exception; use Carp::Clan qw/^DBIx::Class/; -use Scalar::Util qw/weaken/; +use Scalar::Util (); use File::Spec; use Sub::Name (); use Module::Find(); @@ -33,8 +33,9 @@ DBIx::Class::Schema - composable schemas __PACKAGE__->load_namespaces(); package Library::Schema::Result::CD; - use base qw/DBIx::Class/; - __PACKAGE__->load_components(qw/Core/); # for example + use base qw/DBIx::Class::Core/; + + __PACKAGE__->load_components(qw/InflateColumn::DateTime/); # for example __PACKAGE__->table('cd'); # Elsewhere in your code: @@ -81,7 +82,7 @@ particular which module inherits off which. With no arguments, this method uses L to load all your Result classes from a sub-namespace F under your Schema class' -namespace. Eg. With a Schema of I all files in +namespace, i.e. with a Schema of I all files in I are assumed to be Result classes. It also finds all ResultSet classes in the namespace F and @@ -270,6 +271,10 @@ sub load_namespaces { } elsif($rs_class ||= $default_resultset_class) { $class->ensure_class_loaded($rs_class); + if(!$rs_class->isa("DBIx::Class::ResultSet")) { + carp "load_namespaces found ResultSet class $rs_class that does not subclass DBIx::Class::ResultSet"; + } + $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class); } @@ -406,12 +411,10 @@ sub load_classes { Set the storage class that will be instantiated when L is called. If the classname starts with C<::>, the prefix C is -assumed by L. +assumed by L. You want to use this to set subclasses of L -in cases where the appropriate subclass is not autodetected, such as -when dealing with MSSQL via L, in which case you'd set it -to C<::DBI::Sybase::MSSQL>. +in cases where the appropriate subclass is not autodetected. If your storage type requires instantiation arguments, those are defined as a second argument in the form of a hashref and the entire @@ -511,7 +514,7 @@ syntax on the C<@connectinfo> argument, or L in general. Note that C expects an arrayref of arguments, but -C does not. C wraps it's arguments in an arrayref +C does not. C wraps its arguments in an arrayref before passing them to C. =head3 Overloading @@ -543,6 +546,8 @@ name. sub resultset { my ($self, $moniker) = @_; + $self->throw_exception('resultset() expects a source name') + unless defined $moniker; return $self->source($moniker)->resultset; } @@ -629,13 +634,13 @@ See L for more information. This interface is preferred over using the individual methods L, L, and L below. -WARNING: If you are connected with C 0> the transaction is +WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is considered nested, and you will still need to call L to write your -changes when appropriate. You will also want to connect with C -1> to get partial rollback to work, if the storage driver for your database +changes when appropriate. You will also want to connect with C<< auto_savepoint => +1 >> to get partial rollback to work, if the storage driver for your database supports it. -Connecting with C 1> is recommended. +Connecting with C<< AutoCommit => 1 >> is recommended. =cut @@ -668,7 +673,7 @@ sub txn_scope_guard { Begins a transaction (does nothing if AutoCommit is off). Equivalent to calling $schema->storage->txn_begin. See -L for more information. +L for more information. =cut @@ -684,7 +689,7 @@ sub txn_begin { =head2 txn_commit Commits the current transaction. Equivalent to calling -$schema->storage->txn_commit. See L +$schema->storage->txn_commit. See L for more information. =cut @@ -702,7 +707,7 @@ sub txn_commit { Rolls back the current transaction. Equivalent to calling $schema->storage->txn_rollback. See -L for more information. +L for more information. =cut @@ -747,7 +752,7 @@ Otherwise, each set of data is inserted into the database using L, and a arrayref of the resulting row objects is returned. -i.e., +e.g. $schema->populate('Artist', [ [ qw/artistid name/ ], @@ -755,7 +760,7 @@ i.e., [ 2, 'Indie Band' ], ... ]); - + Since wantarray context is basically the same as looping over $rs->create(...) you won't see any performance benefits and in this case the method is more for convenience. Void context sends the column information directly to storage @@ -806,13 +811,13 @@ Overload C to change the behaviour of C. sub connection { my ($self, @info) = @_; return $self if !@info && $self->storage; - + my ($storage_class, $args) = ref $self->storage_type ? ($self->_normalize_storage_type($self->storage_type),{}) : ($self->storage_type, {}); - + $storage_class = 'DBIx::Class::Storage'.$storage_class if $storage_class =~ m/^::/; - eval "require ${storage_class};"; + eval { $self->ensure_class_loaded ($storage_class) }; $self->throw_exception( "No arguments to load_classes and couldn't load ${storage_class} ($@)" ) if $@; @@ -850,7 +855,7 @@ attached to the current schema. It also attaches a corresponding L object to the new $schema object. If C<$additional_base_class> is given, the new composed -classes will inherit from first the corresponding classe from the current +classes will inherit from first the corresponding class from the current schema then the base class. For example, for a schema with My::Schema::CD and My::Schema::Artist classes, @@ -908,7 +913,7 @@ sub compose_namespace { no strict 'refs'; no warnings 'redefine'; foreach my $meth (qw/class source resultset/) { - *{"${target}::${meth}"} = + *{"${target}::${meth}"} = Sub::Name::subname "${target}::${meth}" => sub { shift->schema->$meth(@_) }; } } @@ -926,7 +931,7 @@ sub setup_connection_class { Creates a new savepoint (does nothing outside a transaction). Equivalent to calling $schema->storage->svp_begin. See -L for more information. +L for more information. =cut @@ -943,7 +948,7 @@ sub svp_begin { Releases a savepoint (does nothing outside a transaction). Equivalent to calling $schema->storage->svp_release. See -L for more information. +L for more information. =cut @@ -960,7 +965,7 @@ sub svp_release { Rollback to a savepoint (does nothing outside a transaction). Equivalent to calling $schema->storage->svp_rollback. See -L for more information. +L for more information. =cut @@ -1082,7 +1087,7 @@ sub deployment_statements { $self->storage->deployment_statements($self, @_); } -=head2 create_ddl_dir (EXPERIMENTAL) +=head2 create_ddl_dir =over 4 @@ -1146,7 +1151,7 @@ sub ddl_filename { $filename =~ s/::/-/g; $filename = File::Spec->catfile($dir, "$filename-$version-$type.sql"); $filename =~ s/$version/$preversion-$version/ if($preversion); - + return $filename; } @@ -1154,7 +1159,7 @@ sub ddl_filename { Provided as the recommended way of thawing schema objects. You can call C directly if you wish, but the thawed objects will not have a -reference to any schema, so are rather useless +reference to any schema, so are rather useless. =cut @@ -1166,8 +1171,8 @@ sub thaw { =head2 freeze -This doesn't actualy do anything more than call L, it is just -provided here for symetry. +This doesn't actually do anything more than call L, it is just +provided here for symmetry. =cut @@ -1177,8 +1182,17 @@ sub freeze { =head2 dclone -Recommeneded way of dcloning objects. This is needed to properly maintain -references to the schema object (which itself is B cloned.) +=over 4 + +=item Arguments: $object + +=item Return Value: dcloned $object + +=back + +Recommended way of dcloning L and L +objects so their references to the schema object +(which itself is B cloned) are properly maintained. =cut @@ -1259,6 +1273,24 @@ sub register_source { $self->_register_source(@_); } +=head2 unregister_source + +=over 4 + +=item Arguments: $moniker + +=back + +Removes the L from the schema for the given moniker. + +=cut + +sub unregister_source { + my $self = shift; + + $self->_unregister_source(@_); +} + =head2 register_extra_source =over 4 @@ -1285,7 +1317,7 @@ sub _register_source { $source = $source->new({ %$source, source_name => $moniker }); $source->schema($self); - weaken($source->{schema}) if ref($self); + Scalar::Util::weaken($source->{schema}) if ref($self); my $rs_class = $source->result_class; @@ -1372,7 +1404,7 @@ more information. $self->throw_exception ("No arguments to load_classes and couldn't load ${base} ($@)") if $@; - + if ($self eq $target) { # Pathological case, largely caused by the docs on early C::M::DBIC::Plain foreach my $moniker ($self->sources) { @@ -1385,14 +1417,14 @@ more information. $self->connection(@info); return $self; } - + my $schema = $self->compose_namespace($target, $base); { no strict 'refs'; my $name = join '::', $target, 'schema'; *$name = Sub::Name::subname $name, sub { $schema }; } - + $schema->connection(@info); foreach my $moniker ($schema->sources) { my $source = $schema->source($moniker);