Some cleanups around loading/use of DBIx::Class::Exception (no func. changes)
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Schema.pm
1 package DBIx::Class::Schema;
2
3 use strict;
4 use warnings;
5
6 use DBIx::Class::Carp;
7 use Try::Tiny;
8 use Scalar::Util qw/weaken blessed/;
9 use Sub::Name 'subname';
10 use B 'svref_2object';
11 use Devel::GlobalDestruction;
12 use namespace::clean;
13
14 use base qw/DBIx::Class/;
15
16 __PACKAGE__->mk_classdata('class_mappings' => {});
17 __PACKAGE__->mk_classdata('source_registrations' => {});
18 __PACKAGE__->mk_classdata('storage_type' => '::DBI');
19 __PACKAGE__->mk_classdata('storage');
20 __PACKAGE__->mk_classdata('exception_action');
21 __PACKAGE__->mk_classdata('stacktrace' => $ENV{DBIC_TRACE} || 0);
22 __PACKAGE__->mk_classdata('default_resultset_attributes' => {});
23
24 =head1 NAME
25
26 DBIx::Class::Schema - composable schemas
27
28 =head1 SYNOPSIS
29
30   package Library::Schema;
31   use base qw/DBIx::Class::Schema/;
32
33   # load all Result classes in Library/Schema/Result/
34   __PACKAGE__->load_namespaces();
35
36   package Library::Schema::Result::CD;
37   use base qw/DBIx::Class::Core/;
38
39   __PACKAGE__->load_components(qw/InflateColumn::DateTime/); # for example
40   __PACKAGE__->table('cd');
41
42   # Elsewhere in your code:
43   my $schema1 = Library::Schema->connect(
44     $dsn,
45     $user,
46     $password,
47     { AutoCommit => 1 },
48   );
49
50   my $schema2 = Library::Schema->connect($coderef_returning_dbh);
51
52   # fetch objects using Library::Schema::Result::DVD
53   my $resultset = $schema1->resultset('DVD')->search( ... );
54   my @dvd_objects = $schema2->resultset('DVD')->search( ... );
55
56 =head1 DESCRIPTION
57
58 Creates database classes based on a schema. This is the recommended way to
59 use L<DBIx::Class> and allows you to use more than one concurrent connection
60 with your classes.
61
62 NB: If you're used to L<Class::DBI> it's worth reading the L</SYNOPSIS>
63 carefully, as DBIx::Class does things a little differently. Note in
64 particular which module inherits off which.
65
66 =head1 SETUP METHODS
67
68 =head2 load_namespaces
69
70 =over 4
71
72 =item Arguments: %options?
73
74 =back
75
76   __PACKAGE__->load_namespaces();
77
78   __PACKAGE__->load_namespaces(
79      result_namespace => 'Res',
80      resultset_namespace => 'RSet',
81      default_resultset_class => '+MyDB::Othernamespace::RSet',
82   );
83
84 With no arguments, this method uses L<Module::Find> to load all of the
85 Result and ResultSet classes under the namespace of the schema from
86 which it is called.  For example, C<My::Schema> will by default find
87 and load Result classes named C<My::Schema::Result::*> and ResultSet
88 classes named C<My::Schema::ResultSet::*>.
89
90 ResultSet classes are associated with Result class of the same name.
91 For example, C<My::Schema::Result::CD> will get the ResultSet class
92 C<My::Schema::ResultSet::CD> if it is present.
93
94 Both Result and ResultSet namespaces are configurable via the
95 C<result_namespace> and C<resultset_namespace> options.
96
97 Another option, C<default_resultset_class> specifies a custom default
98 ResultSet class for Result classes with no corresponding ResultSet.
99
100 All of the namespace and classname options are by default relative to
101 the schema classname.  To specify a fully-qualified name, prefix it
102 with a literal C<+>.  For example, C<+Other::NameSpace::Result>.
103
104 =head3 Warnings
105
106 You will be warned if ResultSet classes are discovered for which there
107 are no matching Result classes like this:
108
109   load_namespaces found ResultSet class $classname with no corresponding Result class
110
111 If a Result class is found to already have a ResultSet class set using
112 L</resultset_class> to some other class, you will be warned like this:
113
114   We found ResultSet class '$rs_class' for '$result', but it seems
115   that you had already set '$result' to use '$rs_set' instead
116
117 =head3 Examples
118
119   # load My::Schema::Result::CD, My::Schema::Result::Artist,
120   #    My::Schema::ResultSet::CD, etc...
121   My::Schema->load_namespaces;
122
123   # Override everything to use ugly names.
124   # In this example, if there is a My::Schema::Res::Foo, but no matching
125   #   My::Schema::RSets::Foo, then Foo will have its
126   #   resultset_class set to My::Schema::RSetBase
127   My::Schema->load_namespaces(
128     result_namespace => 'Res',
129     resultset_namespace => 'RSets',
130     default_resultset_class => 'RSetBase',
131   );
132
133   # Put things in other namespaces
134   My::Schema->load_namespaces(
135     result_namespace => '+Some::Place::Results',
136     resultset_namespace => '+Another::Place::RSets',
137   );
138
139 To search multiple namespaces for either Result or ResultSet classes,
140 use an arrayref of namespaces for that option.  In the case that the
141 same result (or resultset) class exists in multiple namespaces, later
142 entries in the list of namespaces will override earlier ones.
143
144   My::Schema->load_namespaces(
145     # My::Schema::Results_C::Foo takes precedence over My::Schema::Results_B::Foo :
146     result_namespace => [ 'Results_A', 'Results_B', 'Results_C' ],
147     resultset_namespace => [ '+Some::Place::RSets', 'RSets' ],
148   );
149
150 =cut
151
152 # Pre-pends our classname to the given relative classname or
153 #   class namespace, unless there is a '+' prefix, which will
154 #   be stripped.
155 sub _expand_relative_name {
156   my ($class, $name) = @_;
157   return if !$name;
158   $name = $class . '::' . $name if ! ($name =~ s/^\+//);
159   return $name;
160 }
161
162 # Finds all modules in the supplied namespace, or if omitted in the
163 # namespace of $class. Untaints all findings as they can be assumed
164 # to be safe
165 sub _findallmod {
166   my $proto = shift;
167   my $ns = shift || ref $proto || $proto;
168
169   require Module::Find;
170
171   # untaint result
172   return map { $_ =~ /(.+)/ } Module::Find::findallmod($ns);
173 }
174
175 # returns a hash of $shortname => $fullname for every package
176 # found in the given namespaces ($shortname is with the $fullname's
177 # namespace stripped off)
178 sub _map_namespaces {
179   my ($class, @namespaces) = @_;
180
181   my @results_hash;
182   foreach my $namespace (@namespaces) {
183     push(
184       @results_hash,
185       map { (substr($_, length "${namespace}::"), $_) }
186       $class->_findallmod($namespace)
187     );
188   }
189
190   @results_hash;
191 }
192
193 # returns the result_source_instance for the passed class/object,
194 # or dies with an informative message (used by load_namespaces)
195 sub _ns_get_rsrc_instance {
196   my $me = shift;
197   my $rs_class = ref ($_[0]) || $_[0];
198
199   return try {
200     $rs_class->result_source_instance
201   } catch {
202     $me->throw_exception (
203       "Attempt to load_namespaces() class $rs_class failed - are you sure this is a real Result Class?: $_"
204     );
205   };
206 }
207
208 sub load_namespaces {
209   my ($class, %args) = @_;
210
211   my $result_namespace = delete $args{result_namespace} || 'Result';
212   my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet';
213   my $default_resultset_class = delete $args{default_resultset_class};
214
215   $class->throw_exception('load_namespaces: unknown option(s): '
216     . join(q{,}, map { qq{'$_'} } keys %args))
217       if scalar keys %args;
218
219   $default_resultset_class
220     = $class->_expand_relative_name($default_resultset_class);
221
222   for my $arg ($result_namespace, $resultset_namespace) {
223     $arg = [ $arg ] if !ref($arg) && $arg;
224
225     $class->throw_exception('load_namespaces: namespace arguments must be '
226       . 'a simple string or an arrayref')
227         if ref($arg) ne 'ARRAY';
228
229     $_ = $class->_expand_relative_name($_) for (@$arg);
230   }
231
232   my %results = $class->_map_namespaces(@$result_namespace);
233   my %resultsets = $class->_map_namespaces(@$resultset_namespace);
234
235   my @to_register;
236   {
237     no warnings qw/redefine/;
238     local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
239     use warnings qw/redefine/;
240
241     # ensure classes are loaded and attached in inheritance order
242     for my $res (values %results) {
243       $class->ensure_class_loaded($res);
244     }
245     my %inh_idx;
246     my @subclass_last = sort {
247
248       ($inh_idx{$a} ||=
249         scalar @{mro::get_linear_isa( $results{$a} )}
250       )
251
252           <=>
253
254       ($inh_idx{$b} ||=
255         scalar @{mro::get_linear_isa( $results{$b} )}
256       )
257
258     } keys(%results);
259
260     foreach my $result (@subclass_last) {
261       my $result_class = $results{$result};
262
263       my $rs_class = delete $resultsets{$result};
264       my $rs_set = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
265
266       if($rs_set && $rs_set ne 'DBIx::Class::ResultSet') {
267         if($rs_class && $rs_class ne $rs_set) {
268           carp "We found ResultSet class '$rs_class' for '$result', but it seems "
269              . "that you had already set '$result' to use '$rs_set' instead";
270         }
271       }
272       elsif($rs_class ||= $default_resultset_class) {
273         $class->ensure_class_loaded($rs_class);
274         if(!$rs_class->isa("DBIx::Class::ResultSet")) {
275             carp "load_namespaces found ResultSet class $rs_class that does not subclass DBIx::Class::ResultSet";
276         }
277
278         $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class);
279       }
280
281       my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $result;
282
283       push(@to_register, [ $source_name, $result_class ]);
284     }
285   }
286
287   foreach (sort keys %resultsets) {
288     carp "load_namespaces found ResultSet class $_ with no "
289       . 'corresponding Result class';
290   }
291
292   Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO;
293
294   $class->register_class(@$_) for (@to_register);
295
296   return;
297 }
298
299 =head2 load_classes
300
301 =over 4
302
303 =item Arguments: @classes?, { $namespace => [ @classes ] }+
304
305 =back
306
307 L</load_classes> is an alternative method to L</load_namespaces>, both of
308 which serve similar purposes, each with different advantages and disadvantages.
309 In the general case you should use L</load_namespaces>, unless you need to
310 be able to specify that only specific classes are loaded at runtime.
311
312 With no arguments, this method uses L<Module::Find> to find all classes under
313 the schema's namespace. Otherwise, this method loads the classes you specify
314 (using L<use>), and registers them (using L</"register_class">).
315
316 It is possible to comment out classes with a leading C<#>, but note that perl
317 will think it's a mistake (trying to use a comment in a qw list), so you'll
318 need to add C<no warnings 'qw';> before your load_classes call.
319
320 If any classes found do not appear to be Result class files, you will
321 get the following warning:
322
323    Failed to load $comp_class. Can't find source_name method. Is
324    $comp_class really a full DBIC result class? Fix it, move it elsewhere,
325    or make your load_classes call more specific.
326
327 Example:
328
329   My::Schema->load_classes(); # loads My::Schema::CD, My::Schema::Artist,
330                               # etc. (anything under the My::Schema namespace)
331
332   # loads My::Schema::CD, My::Schema::Artist, Other::Namespace::Producer but
333   # not Other::Namespace::LinerNotes nor My::Schema::Track
334   My::Schema->load_classes(qw/ CD Artist #Track /, {
335     Other::Namespace => [qw/ Producer #LinerNotes /],
336   });
337
338 =cut
339
340 sub load_classes {
341   my ($class, @params) = @_;
342
343   my %comps_for;
344
345   if (@params) {
346     foreach my $param (@params) {
347       if (ref $param eq 'ARRAY') {
348         # filter out commented entries
349         my @modules = grep { $_ !~ /^#/ } @$param;
350
351         push (@{$comps_for{$class}}, @modules);
352       }
353       elsif (ref $param eq 'HASH') {
354         # more than one namespace possible
355         for my $comp ( keys %$param ) {
356           # filter out commented entries
357           my @modules = grep { $_ !~ /^#/ } @{$param->{$comp}};
358
359           push (@{$comps_for{$comp}}, @modules);
360         }
361       }
362       else {
363         # filter out commented entries
364         push (@{$comps_for{$class}}, $param) if $param !~ /^#/;
365       }
366     }
367   } else {
368     my @comp = map { substr $_, length "${class}::"  }
369                  $class->_findallmod;
370     $comps_for{$class} = \@comp;
371   }
372
373   my @to_register;
374   {
375     no warnings qw/redefine/;
376     local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
377     use warnings qw/redefine/;
378
379     foreach my $prefix (keys %comps_for) {
380       foreach my $comp (@{$comps_for{$prefix}||[]}) {
381         my $comp_class = "${prefix}::${comp}";
382         $class->ensure_class_loaded($comp_class);
383
384         my $snsub = $comp_class->can('source_name');
385         if(! $snsub ) {
386           carp "Failed to load $comp_class. Can't find source_name method. Is $comp_class really a full DBIC result class? Fix it, move it elsewhere, or make your load_classes call more specific.";
387           next;
388         }
389         $comp = $snsub->($comp_class) || $comp;
390
391         push(@to_register, [ $comp, $comp_class ]);
392       }
393     }
394   }
395   Class::C3->reinitialize if DBIx::Class::_ENV_::OLD_MRO;
396
397   foreach my $to (@to_register) {
398     $class->register_class(@$to);
399   }
400 }
401
402 =head2 storage_type
403
404 =over 4
405
406 =item Arguments: $storage_type|{$storage_type, \%args}
407
408 =item Return Value: $storage_type|{$storage_type, \%args}
409
410 =item Default value: DBIx::Class::Storage::DBI
411
412 =back
413
414 Set the storage class that will be instantiated when L</connect> is called.
415 If the classname starts with C<::>, the prefix C<DBIx::Class::Storage> is
416 assumed by L</connect>.
417
418 You want to use this to set subclasses of L<DBIx::Class::Storage::DBI>
419 in cases where the appropriate subclass is not autodetected.
420
421 If your storage type requires instantiation arguments, those are
422 defined as a second argument in the form of a hashref and the entire
423 value needs to be wrapped into an arrayref or a hashref.  We support
424 both types of refs here in order to play nice with your
425 Config::[class] or your choice. See
426 L<DBIx::Class::Storage::DBI::Replicated> for an example of this.
427
428 =head2 exception_action
429
430 =over 4
431
432 =item Arguments: $code_reference
433
434 =item Return Value: $code_reference
435
436 =item Default value: None
437
438 =back
439
440 When L</throw_exception> is invoked and L</exception_action> is set to a code
441 reference, this reference will be called instead of
442 L<DBIx::Class::Exception/throw>, with the exception message passed as the only
443 argument.
444
445 Your custom throw code B<must> rethrow the exception, as L</throw_exception> is
446 an integral part of DBIC's internal execution control flow.
447
448 Example:
449
450    package My::Schema;
451    use base qw/DBIx::Class::Schema/;
452    use My::ExceptionClass;
453    __PACKAGE__->exception_action(sub { My::ExceptionClass->throw(@_) });
454    __PACKAGE__->load_classes;
455
456    # or:
457    my $schema_obj = My::Schema->connect( .... );
458    $schema_obj->exception_action(sub { My::ExceptionClass->throw(@_) });
459
460 =head2 stacktrace
461
462 =over 4
463
464 =item Arguments: boolean
465
466 =back
467
468 Whether L</throw_exception> should include stack trace information.
469 Defaults to false normally, but defaults to true if C<$ENV{DBIC_TRACE}>
470 is true.
471
472 =head2 sqlt_deploy_hook
473
474 =over
475
476 =item Arguments: $sqlt_schema
477
478 =back
479
480 An optional sub which you can declare in your own Schema class that will get
481 passed the L<SQL::Translator::Schema> object when you deploy the schema via
482 L</create_ddl_dir> or L</deploy>.
483
484 For an example of what you can do with this, see
485 L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
486
487 Note that sqlt_deploy_hook is called by L</deployment_statements>, which in turn
488 is called before L</deploy>. Therefore the hook can be used only to manipulate
489 the L<SQL::Translator::Schema> object before it is turned into SQL fed to the
490 database. If you want to execute post-deploy statements which can not be generated
491 by L<SQL::Translator>, the currently suggested method is to overload L</deploy>
492 and use L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
493
494 =head1 METHODS
495
496 =head2 connect
497
498 =over 4
499
500 =item Arguments: @connectinfo
501
502 =item Return Value: $new_schema
503
504 =back
505
506 Creates and returns a new Schema object. The connection info set on it
507 is used to create a new instance of the storage backend and set it on
508 the Schema object.
509
510 See L<DBIx::Class::Storage::DBI/"connect_info"> for DBI-specific
511 syntax on the C<@connectinfo> argument, or L<DBIx::Class::Storage> in
512 general.
513
514 Note that C<connect_info> expects an arrayref of arguments, but
515 C<connect> does not. C<connect> wraps its arguments in an arrayref
516 before passing them to C<connect_info>.
517
518 =head3 Overloading
519
520 C<connect> is a convenience method. It is equivalent to calling
521 $schema->clone->connection(@connectinfo). To write your own overloaded
522 version, overload L</connection> instead.
523
524 =cut
525
526 sub connect { shift->clone->connection(@_) }
527
528 =head2 resultset
529
530 =over 4
531
532 =item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>
533
534 =item Return Value: L<$resultset|DBIx::Class::ResultSet>
535
536 =back
537
538   my $rs = $schema->resultset('DVD');
539
540 Returns the L<DBIx::Class::ResultSet> object for the registered source
541 name.
542
543 =cut
544
545 sub resultset {
546   my ($self, $source_name) = @_;
547   $self->throw_exception('resultset() expects a source name')
548     unless defined $source_name;
549   return $self->source($source_name)->resultset;
550 }
551
552 =head2 sources
553
554 =over 4
555
556 =item Return Value: L<@source_names|DBIx::Class::ResultSource/source_name>
557
558 =back
559
560   my @source_names = $schema->sources;
561
562 Lists names of all the sources registered on this Schema object.
563
564 =cut
565
566 sub sources { return keys %{shift->source_registrations}; }
567
568 =head2 source
569
570 =over 4
571
572 =item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>
573
574 =item Return Value: L<$result_source|DBIx::Class::ResultSource>
575
576 =back
577
578   my $source = $schema->source('Book');
579
580 Returns the L<DBIx::Class::ResultSource> object for the registered
581 source name.
582
583 =cut
584
585 sub source {
586   my $self = shift;
587
588   $self->throw_exception("source() expects a source name")
589     unless @_;
590
591   my $source_name = shift;
592
593   my $sreg = $self->source_registrations;
594   return $sreg->{$source_name} if exists $sreg->{$source_name};
595
596   # if we got here, they probably passed a full class name
597   my $mapped = $self->class_mappings->{$source_name};
598   $self->throw_exception("Can't find source for ${source_name}")
599     unless $mapped && exists $sreg->{$mapped};
600   return $sreg->{$mapped};
601 }
602
603 =head2 class
604
605 =over 4
606
607 =item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>
608
609 =item Return Value: $classname
610
611 =back
612
613   my $class = $schema->class('CD');
614
615 Retrieves the Result class name for the given source name.
616
617 =cut
618
619 sub class {
620   return shift->source(shift)->result_class;
621 }
622
623 =head2 txn_do
624
625 =over 4
626
627 =item Arguments: C<$coderef>, @coderef_args?
628
629 =item Return Value: The return value of $coderef
630
631 =back
632
633 Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
634 returning its result (if any). Equivalent to calling $schema->storage->txn_do.
635 See L<DBIx::Class::Storage/"txn_do"> for more information.
636
637 This interface is preferred over using the individual methods L</txn_begin>,
638 L</txn_commit>, and L</txn_rollback> below.
639
640 WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is
641 considered nested, and you will still need to call L</txn_commit> to write your
642 changes when appropriate. You will also want to connect with C<< auto_savepoint =>
643 1 >> to get partial rollback to work, if the storage driver for your database
644 supports it.
645
646 Connecting with C<< AutoCommit => 1 >> is recommended.
647
648 =cut
649
650 sub txn_do {
651   my $self = shift;
652
653   $self->storage or $self->throw_exception
654     ('txn_do called on $schema without storage');
655
656   $self->storage->txn_do(@_);
657 }
658
659 =head2 txn_scope_guard
660
661 Runs C<txn_scope_guard> on the schema's storage. See
662 L<DBIx::Class::Storage/txn_scope_guard>.
663
664 =cut
665
666 sub txn_scope_guard {
667   my $self = shift;
668
669   $self->storage or $self->throw_exception
670     ('txn_scope_guard called on $schema without storage');
671
672   $self->storage->txn_scope_guard(@_);
673 }
674
675 =head2 txn_begin
676
677 Begins a transaction (does nothing if AutoCommit is off). Equivalent to
678 calling $schema->storage->txn_begin. See
679 L<DBIx::Class::Storage/"txn_begin"> for more information.
680
681 =cut
682
683 sub txn_begin {
684   my $self = shift;
685
686   $self->storage or $self->throw_exception
687     ('txn_begin called on $schema without storage');
688
689   $self->storage->txn_begin;
690 }
691
692 =head2 txn_commit
693
694 Commits the current transaction. Equivalent to calling
695 $schema->storage->txn_commit. See L<DBIx::Class::Storage/"txn_commit">
696 for more information.
697
698 =cut
699
700 sub txn_commit {
701   my $self = shift;
702
703   $self->storage or $self->throw_exception
704     ('txn_commit called on $schema without storage');
705
706   $self->storage->txn_commit;
707 }
708
709 =head2 txn_rollback
710
711 Rolls back the current transaction. Equivalent to calling
712 $schema->storage->txn_rollback. See
713 L<DBIx::Class::Storage/"txn_rollback"> for more information.
714
715 =cut
716
717 sub txn_rollback {
718   my $self = shift;
719
720   $self->storage or $self->throw_exception
721     ('txn_rollback called on $schema without storage');
722
723   $self->storage->txn_rollback;
724 }
725
726 =head2 storage
727
728   my $storage = $schema->storage;
729
730 Returns the L<DBIx::Class::Storage> object for this Schema. Grab this
731 if you want to turn on SQL statement debugging at runtime, or set the
732 quote character. For the default storage, the documentation can be
733 found in L<DBIx::Class::Storage::DBI>.
734
735 =head2 populate
736
737 =over 4
738
739 =item Arguments: L<$source_name|DBIx::Class::ResultSource/source_name>, [ \@column_list, \@row_values+ ] | [ \%col_data+ ]
740
741 =item Return Value: L<\@result_objects|DBIx::Class::Manual::ResultClass> (scalar context) | L<@result_objects|DBIx::Class::Manual::ResultClass> (list context)
742
743 =back
744
745 A convenience shortcut to L<DBIx::Class::ResultSet/populate>. Equivalent to:
746
747  $schema->resultset($source_name)->populate([...]);
748
749 =over 4
750
751 =item NOTE
752
753 The context of this method call has an important effect on what is
754 submitted to storage. In void context data is fed directly to fastpath
755 insertion routines provided by the underlying storage (most often
756 L<DBI/execute_for_fetch>), bypassing the L<new|DBIx::Class::Row/new> and
757 L<insert|DBIx::Class::Row/insert> calls on the
758 L<Result|DBIx::Class::Manual::ResultClass> class, including any
759 augmentation of these methods provided by components. For example if you
760 are using something like L<DBIx::Class::UUIDColumns> to create primary
761 keys for you, you will find that your PKs are empty.  In this case you
762 will have to explicitly force scalar or list context in order to create
763 those values.
764
765 =back
766
767 =cut
768
769 sub populate {
770   my ($self, $name, $data) = @_;
771   my $rs = $self->resultset($name)
772     or $self->throw_exception("'$name' is not a resultset");
773
774   return $rs->populate($data);
775 }
776
777 =head2 connection
778
779 =over 4
780
781 =item Arguments: @args
782
783 =item Return Value: $new_schema
784
785 =back
786
787 Similar to L</connect> except sets the storage object and connection
788 data in-place on the Schema class. You should probably be calling
789 L</connect> to get a proper Schema object instead.
790
791 =head3 Overloading
792
793 Overload C<connection> to change the behaviour of C<connect>.
794
795 =cut
796
797 sub connection {
798   my ($self, @info) = @_;
799   return $self if !@info && $self->storage;
800
801   my ($storage_class, $args) = ref $self->storage_type ?
802     ($self->_normalize_storage_type($self->storage_type),{}) : ($self->storage_type, {});
803
804   $storage_class = 'DBIx::Class::Storage'.$storage_class
805     if $storage_class =~ m/^::/;
806   try {
807     $self->ensure_class_loaded ($storage_class);
808   }
809   catch {
810     $self->throw_exception(
811       "Unable to load storage class ${storage_class}: $_"
812     );
813   };
814   my $storage = $storage_class->new($self=>$args);
815   $storage->connect_info(\@info);
816   $self->storage($storage);
817   return $self;
818 }
819
820 sub _normalize_storage_type {
821   my ($self, $storage_type) = @_;
822   if(ref $storage_type eq 'ARRAY') {
823     return @$storage_type;
824   } elsif(ref $storage_type eq 'HASH') {
825     return %$storage_type;
826   } else {
827     $self->throw_exception('Unsupported REFTYPE given: '. ref $storage_type);
828   }
829 }
830
831 =head2 compose_namespace
832
833 =over 4
834
835 =item Arguments: $target_namespace, $additional_base_class?
836
837 =item Retur Value: $new_schema
838
839 =back
840
841 For each L<DBIx::Class::ResultSource> in the schema, this method creates a
842 class in the target namespace (e.g. $target_namespace::CD,
843 $target_namespace::Artist) that inherits from the corresponding classes
844 attached to the current schema.
845
846 It also attaches a corresponding L<DBIx::Class::ResultSource> object to the
847 new $schema object. If C<$additional_base_class> is given, the new composed
848 classes will inherit from first the corresponding class from the current
849 schema then the base class.
850
851 For example, for a schema with My::Schema::CD and My::Schema::Artist classes,
852
853   $schema->compose_namespace('My::DB', 'Base::Class');
854   print join (', ', @My::DB::CD::ISA) . "\n";
855   print join (', ', @My::DB::Artist::ISA) ."\n";
856
857 will produce the output
858
859   My::Schema::CD, Base::Class
860   My::Schema::Artist, Base::Class
861
862 =cut
863
864 # this might be oversimplified
865 # sub compose_namespace {
866 #   my ($self, $target, $base) = @_;
867
868 #   my $schema = $self->clone;
869 #   foreach my $source_name ($schema->sources) {
870 #     my $source = $schema->source($source_name);
871 #     my $target_class = "${target}::${source_name}";
872 #     $self->inject_base(
873 #       $target_class => $source->result_class, ($base ? $base : ())
874 #     );
875 #     $source->result_class($target_class);
876 #     $target_class->result_source_instance($source)
877 #       if $target_class->can('result_source_instance');
878 #     $schema->register_source($source_name, $source);
879 #   }
880 #   return $schema;
881 # }
882
883 sub compose_namespace {
884   my ($self, $target, $base) = @_;
885
886   my $schema = $self->clone;
887
888   $schema->source_registrations({});
889
890   # the original class-mappings must remain - otherwise
891   # reverse_relationship_info will not work
892   #$schema->class_mappings({});
893
894   {
895     no warnings qw/redefine/;
896     local *Class::C3::reinitialize = sub { } if DBIx::Class::_ENV_::OLD_MRO;
897     use warnings qw/redefine/;
898
899     no strict qw/refs/;
900     foreach my $source_name ($self->sources) {
901       my $orig_source = $self->source($source_name);
902
903       my $target_class = "${target}::${source_name}";
904       $self->inject_base($target_class, $orig_source->result_class, ($base || ()) );
905
906       # register_source examines result_class, and then returns us a clone
907       my $new_source = $schema->register_source($source_name, bless
908         { %$orig_source, result_class => $target_class },
909         ref $orig_source,
910       );
911
912       if ($target_class->can('result_source_instance')) {
913         # give the class a schema-less source copy
914         $target_class->result_source_instance( bless
915           { %$new_source, schema => ref $new_source->{schema} || $new_source->{schema} },
916           ref $new_source,
917         );
918       }
919     }
920
921     foreach my $meth (qw/class source resultset/) {
922       no warnings 'redefine';
923       *{"${target}::${meth}"} = subname "${target}::${meth}" =>
924         sub { shift->schema->$meth(@_) };
925     }
926   }
927
928   Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
929
930   return $schema;
931 }
932
933 sub setup_connection_class {
934   my ($class, $target, @info) = @_;
935   $class->inject_base($target => 'DBIx::Class::DB');
936   #$target->load_components('DB');
937   $target->connection(@info);
938 }
939
940 =head2 svp_begin
941
942 Creates a new savepoint (does nothing outside a transaction).
943 Equivalent to calling $schema->storage->svp_begin.  See
944 L<DBIx::Class::Storage/"svp_begin"> for more information.
945
946 =cut
947
948 sub svp_begin {
949   my ($self, $name) = @_;
950
951   $self->storage or $self->throw_exception
952     ('svp_begin called on $schema without storage');
953
954   $self->storage->svp_begin($name);
955 }
956
957 =head2 svp_release
958
959 Releases a savepoint (does nothing outside a transaction).
960 Equivalent to calling $schema->storage->svp_release.  See
961 L<DBIx::Class::Storage/"svp_release"> for more information.
962
963 =cut
964
965 sub svp_release {
966   my ($self, $name) = @_;
967
968   $self->storage or $self->throw_exception
969     ('svp_release called on $schema without storage');
970
971   $self->storage->svp_release($name);
972 }
973
974 =head2 svp_rollback
975
976 Rollback to a savepoint (does nothing outside a transaction).
977 Equivalent to calling $schema->storage->svp_rollback.  See
978 L<DBIx::Class::Storage/"svp_rollback"> for more information.
979
980 =cut
981
982 sub svp_rollback {
983   my ($self, $name) = @_;
984
985   $self->storage or $self->throw_exception
986     ('svp_rollback called on $schema without storage');
987
988   $self->storage->svp_rollback($name);
989 }
990
991 =head2 clone
992
993 =over 4
994
995 =item Arguments: %attrs?
996
997 =item Return Value: $new_schema
998
999 =back
1000
1001 Clones the schema and its associated result_source objects and returns the
1002 copy. The resulting copy will have the same attributes as the source schema,
1003 except for those attributes explicitly overriden by the provided C<%attrs>.
1004
1005 =cut
1006
1007 sub clone {
1008   my $self = shift;
1009
1010   my $clone = {
1011       (ref $self ? %$self : ()),
1012       (@_ == 1 && ref $_[0] eq 'HASH' ? %{ $_[0] } : @_),
1013   };
1014   bless $clone, (ref $self || $self);
1015
1016   $clone->$_(undef) for qw/class_mappings source_registrations storage/;
1017
1018   $clone->_copy_state_from($self);
1019
1020   return $clone;
1021 }
1022
1023 # Needed in Schema::Loader - if you refactor, please make a compatibility shim
1024 # -- Caelum
1025 sub _copy_state_from {
1026   my ($self, $from) = @_;
1027
1028   $self->class_mappings({ %{$from->class_mappings} });
1029   $self->source_registrations({ %{$from->source_registrations} });
1030
1031   foreach my $source_name ($from->sources) {
1032     my $source = $from->source($source_name);
1033     my $new = $source->new($source);
1034     # we use extra here as we want to leave the class_mappings as they are
1035     # but overwrite the source_registrations entry with the new source
1036     $self->register_extra_source($source_name => $new);
1037   }
1038
1039   if ($from->storage) {
1040     $self->storage($from->storage);
1041     $self->storage->set_schema($self);
1042   }
1043 }
1044
1045 =head2 throw_exception
1046
1047 =over 4
1048
1049 =item Arguments: $message
1050
1051 =back
1052
1053 Throws an exception. Obeys the exemption rules of L<DBIx::Class::Carp> to report
1054 errors from outer-user's perspective. See L</exception_action> for details on overriding
1055 this method's behavior.  If L</stacktrace> is turned on, C<throw_exception>'s
1056 default behavior will provide a detailed stack trace.
1057
1058 =cut
1059
1060 sub throw_exception {
1061   my $self = shift;
1062
1063   if (my $act = $self->exception_action) {
1064     if ($act->(@_)) {
1065       DBIx::Class::Exception->throw(
1066           "Invocation of the exception_action handler installed on $self did *not*"
1067         .' result in an exception. DBIx::Class is unable to function without a reliable'
1068         .' exception mechanism, ensure that exception_action does not hide exceptions'
1069         ." (original error: $_[0])"
1070       );
1071     }
1072
1073     carp_unique (
1074       "The exception_action handler installed on $self returned false instead"
1075     .' of throwing an exception. This behavior has been deprecated, adjust your'
1076     .' handler to always rethrow the supplied error.'
1077     );
1078   }
1079
1080   DBIx::Class::Exception->throw($_[0], $self->stacktrace);
1081 }
1082
1083 =head2 deploy
1084
1085 =over 4
1086
1087 =item Arguments: \%sqlt_args, $dir
1088
1089 =back
1090
1091 Attempts to deploy the schema to the current storage using L<SQL::Translator>.
1092
1093 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
1094 The most common value for this would be C<< { add_drop_table => 1 } >>
1095 to have the SQL produced include a C<DROP TABLE> statement for each table
1096 created. For quoting purposes supply C<quote_table_names> and
1097 C<quote_field_names>.
1098
1099 Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash
1100 ref or an array ref, containing a list of source to deploy. If present, then
1101 only the sources listed will get deployed. Furthermore, you can use the
1102 C<add_fk_index> parser parameter to prevent the parser from creating an index for each
1103 FK.
1104
1105 =cut
1106
1107 sub deploy {
1108   my ($self, $sqltargs, $dir) = @_;
1109   $self->throw_exception("Can't deploy without storage") unless $self->storage;
1110   $self->storage->deploy($self, undef, $sqltargs, $dir);
1111 }
1112
1113 =head2 deployment_statements
1114
1115 =over 4
1116
1117 =item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
1118
1119 =item Return Value: $listofstatements
1120
1121 =back
1122
1123 A convenient shortcut to
1124 C<< $self->storage->deployment_statements($self, @args) >>.
1125 Returns the SQL statements used by L</deploy> and
1126 L<DBIx::Class::Schema::Storage/deploy>.
1127
1128 =cut
1129
1130 sub deployment_statements {
1131   my $self = shift;
1132
1133   $self->throw_exception("Can't generate deployment statements without a storage")
1134     if not $self->storage;
1135
1136   $self->storage->deployment_statements($self, @_);
1137 }
1138
1139 =head2 create_ddl_dir
1140
1141 =over 4
1142
1143 =item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
1144
1145 =back
1146
1147 A convenient shortcut to
1148 C<< $self->storage->create_ddl_dir($self, @args) >>.
1149
1150 Creates an SQL file based on the Schema, for each of the specified
1151 database types, in the given directory.
1152
1153 =cut
1154
1155 sub create_ddl_dir {
1156   my $self = shift;
1157
1158   $self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage;
1159   $self->storage->create_ddl_dir($self, @_);
1160 }
1161
1162 =head2 ddl_filename
1163
1164 =over 4
1165
1166 =item Arguments: $database-type, $version, $directory, $preversion
1167
1168 =item Return Value: $normalised_filename
1169
1170 =back
1171
1172   my $filename = $table->ddl_filename($type, $version, $dir, $preversion)
1173
1174 This method is called by C<create_ddl_dir> to compose a file name out of
1175 the supplied directory, database type and version number. The default file
1176 name format is: C<$dir$schema-$version-$type.sql>.
1177
1178 You may override this method in your schema if you wish to use a different
1179 format.
1180
1181  WARNING
1182
1183  Prior to DBIx::Class version 0.08100 this method had a different signature:
1184
1185     my $filename = $table->ddl_filename($type, $dir, $version, $preversion)
1186
1187  In recent versions variables $dir and $version were reversed in order to
1188  bring the signature in line with other Schema/Storage methods. If you
1189  really need to maintain backward compatibility, you can do the following
1190  in any overriding methods:
1191
1192     ($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100);
1193
1194 =cut
1195
1196 sub ddl_filename {
1197   my ($self, $type, $version, $dir, $preversion) = @_;
1198
1199   require File::Spec;
1200
1201   $version = "$preversion-$version" if $preversion;
1202
1203   my $class = blessed($self) || $self;
1204   $class =~ s/::/-/g;
1205
1206   return File::Spec->catfile($dir, "$class-$version-$type.sql");
1207 }
1208
1209 =head2 thaw
1210
1211 Provided as the recommended way of thawing schema objects. You can call
1212 C<Storable::thaw> directly if you wish, but the thawed objects will not have a
1213 reference to any schema, so are rather useless.
1214
1215 =cut
1216
1217 sub thaw {
1218   my ($self, $obj) = @_;
1219   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1220   require Storable;
1221   return Storable::thaw($obj);
1222 }
1223
1224 =head2 freeze
1225
1226 This doesn't actually do anything more than call L<Storable/nfreeze>, it is just
1227 provided here for symmetry.
1228
1229 =cut
1230
1231 sub freeze {
1232   require Storable;
1233   return Storable::nfreeze($_[1]);
1234 }
1235
1236 =head2 dclone
1237
1238 =over 4
1239
1240 =item Arguments: $object
1241
1242 =item Return Value: dcloned $object
1243
1244 =back
1245
1246 Recommended way of dcloning L<DBIx::Class::Row> and L<DBIx::Class::ResultSet>
1247 objects so their references to the schema object
1248 (which itself is B<not> cloned) are properly maintained.
1249
1250 =cut
1251
1252 sub dclone {
1253   my ($self, $obj) = @_;
1254   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1255   require Storable;
1256   return Storable::dclone($obj);
1257 }
1258
1259 =head2 schema_version
1260
1261 Returns the current schema class' $VERSION in a normalised way.
1262
1263 =cut
1264
1265 sub schema_version {
1266   my ($self) = @_;
1267   my $class = ref($self)||$self;
1268
1269   # does -not- use $schema->VERSION
1270   # since that varies in results depending on if version.pm is installed, and if
1271   # so the perl or XS versions. If you want this to change, bug the version.pm
1272   # author to make vpp and vxs behave the same.
1273
1274   my $version;
1275   {
1276     no strict 'refs';
1277     $version = ${"${class}::VERSION"};
1278   }
1279   return $version;
1280 }
1281
1282
1283 =head2 register_class
1284
1285 =over 4
1286
1287 =item Arguments: $source_name, $component_class
1288
1289 =back
1290
1291 This method is called by L</load_namespaces> and L</load_classes> to install the found classes into your Schema. You should be using those instead of this one.
1292
1293 You will only need this method if you have your Result classes in
1294 files which are not named after the packages (or all in the same
1295 file). You may also need it to register classes at runtime.
1296
1297 Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to
1298 calling:
1299
1300   $schema->register_source($source_name, $component_class->result_source_instance);
1301
1302 =cut
1303
1304 sub register_class {
1305   my ($self, $source_name, $to_register) = @_;
1306   $self->register_source($source_name => $to_register->result_source_instance);
1307 }
1308
1309 =head2 register_source
1310
1311 =over 4
1312
1313 =item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1314
1315 =back
1316
1317 This method is called by L</register_class>.
1318
1319 Registers the L<DBIx::Class::ResultSource> in the schema with the given
1320 source name.
1321
1322 =cut
1323
1324 sub register_source { shift->_register_source(@_) }
1325
1326 =head2 unregister_source
1327
1328 =over 4
1329
1330 =item Arguments: $source_name
1331
1332 =back
1333
1334 Removes the L<DBIx::Class::ResultSource> from the schema for the given source name.
1335
1336 =cut
1337
1338 sub unregister_source { shift->_unregister_source(@_) }
1339
1340 =head2 register_extra_source
1341
1342 =over 4
1343
1344 =item Arguments: $source_name, L<$result_source|DBIx::Class::ResultSource>
1345
1346 =back
1347
1348 As L</register_source> but should be used if the result class already
1349 has a source and you want to register an extra one.
1350
1351 =cut
1352
1353 sub register_extra_source { shift->_register_source(@_, { extra => 1 }) }
1354
1355 sub _register_source {
1356   my ($self, $source_name, $source, $params) = @_;
1357
1358   $source = $source->new({ %$source, source_name => $source_name });
1359
1360   $source->schema($self);
1361   weaken $source->{schema} if ref($self);
1362
1363   my %reg = %{$self->source_registrations};
1364   $reg{$source_name} = $source;
1365   $self->source_registrations(\%reg);
1366
1367   return $source if $params->{extra};
1368
1369   my $rs_class = $source->result_class;
1370   if ($rs_class and my $rsrc = try { $rs_class->result_source_instance } ) {
1371     my %map = %{$self->class_mappings};
1372     if (
1373       exists $map{$rs_class}
1374         and
1375       $map{$rs_class} ne $source_name
1376         and
1377       $rsrc ne $_[2]  # orig_source
1378     ) {
1379       carp
1380         "$rs_class already had a registered source which was replaced by this call. "
1381       . 'Perhaps you wanted register_extra_source(), though it is more likely you did '
1382       . 'something wrong.'
1383       ;
1384     }
1385
1386     $map{$rs_class} = $source_name;
1387     $self->class_mappings(\%map);
1388   }
1389
1390   return $source;
1391 }
1392
1393 my $global_phase_destroy;
1394 sub DESTROY {
1395   return if $global_phase_destroy ||= in_global_destruction;
1396
1397   my $self = shift;
1398   my $srcs = $self->source_registrations;
1399
1400   for my $source_name (keys %$srcs) {
1401     # find first source that is not about to be GCed (someone other than $self
1402     # holds a reference to it) and reattach to it, weakening our own link
1403     #
1404     # during global destruction (if we have not yet bailed out) this should throw
1405     # which will serve as a signal to not try doing anything else
1406     # however beware - on older perls the exception seems randomly untrappable
1407     # due to some weird race condition during thread joining :(((
1408     if (ref $srcs->{$source_name} and svref_2object($srcs->{$source_name})->REFCNT > 1) {
1409       local $@;
1410       eval {
1411         $srcs->{$source_name}->schema($self);
1412         weaken $srcs->{$source_name};
1413         1;
1414       } or do {
1415         $global_phase_destroy = 1;
1416       };
1417
1418       last;
1419     }
1420   }
1421 }
1422
1423 sub _unregister_source {
1424     my ($self, $source_name) = @_;
1425     my %reg = %{$self->source_registrations};
1426
1427     my $source = delete $reg{$source_name};
1428     $self->source_registrations(\%reg);
1429     if ($source->result_class) {
1430         my %map = %{$self->class_mappings};
1431         delete $map{$source->result_class};
1432         $self->class_mappings(\%map);
1433     }
1434 }
1435
1436
1437 =head2 compose_connection (DEPRECATED)
1438
1439 =over 4
1440
1441 =item Arguments: $target_namespace, @db_info
1442
1443 =item Return Value: $new_schema
1444
1445 =back
1446
1447 DEPRECATED. You probably wanted compose_namespace.
1448
1449 Actually, you probably just wanted to call connect.
1450
1451 =begin hidden
1452
1453 (hidden due to deprecation)
1454
1455 Calls L<DBIx::Class::Schema/"compose_namespace"> to the target namespace,
1456 calls L<DBIx::Class::Schema/connection> with @db_info on the new schema,
1457 then injects the L<DBix::Class::ResultSetProxy> component and a
1458 resultset_instance classdata entry on all the new classes, in order to support
1459 $target_namespaces::$class->search(...) method calls.
1460
1461 This is primarily useful when you have a specific need for class method access
1462 to a connection. In normal usage it is preferred to call
1463 L<DBIx::Class::Schema/connect> and use the resulting schema object to operate
1464 on L<DBIx::Class::ResultSet> objects with L<DBIx::Class::Schema/resultset> for
1465 more information.
1466
1467 =end hidden
1468
1469 =cut
1470
1471 sub compose_connection {
1472   my ($self, $target, @info) = @_;
1473
1474   carp_once "compose_connection deprecated as of 0.08000"
1475     unless $INC{"DBIx/Class/CDBICompat.pm"};
1476
1477   my $base = 'DBIx::Class::ResultSetProxy';
1478   try {
1479     eval "require ${base};"
1480   }
1481   catch {
1482     $self->throw_exception
1483       ("No arguments to load_classes and couldn't load ${base} ($_)")
1484   };
1485
1486   if ($self eq $target) {
1487     # Pathological case, largely caused by the docs on early C::M::DBIC::Plain
1488     foreach my $source_name ($self->sources) {
1489       my $source = $self->source($source_name);
1490       my $class = $source->result_class;
1491       $self->inject_base($class, $base);
1492       $class->mk_classdata(resultset_instance => $source->resultset);
1493       $class->mk_classdata(class_resolver => $self);
1494     }
1495     $self->connection(@info);
1496     return $self;
1497   }
1498
1499   my $schema = $self->compose_namespace($target, $base);
1500   {
1501     no strict 'refs';
1502     my $name = join '::', $target, 'schema';
1503     *$name = subname $name, sub { $schema };
1504   }
1505
1506   $schema->connection(@info);
1507   foreach my $source_name ($schema->sources) {
1508     my $source = $schema->source($source_name);
1509     my $class = $source->result_class;
1510     #warn "$source_name $class $source ".$source->storage;
1511     $class->mk_classdata(result_source_instance => $source);
1512     $class->mk_classdata(resultset_instance => $source->resultset);
1513     $class->mk_classdata(class_resolver => $schema);
1514   }
1515   return $schema;
1516 }
1517
1518 1;
1519
1520 =head1 AUTHOR AND CONTRIBUTORS
1521
1522 See L<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
1523
1524 =head1 LICENSE
1525
1526 You may distribute this code under the same terms as Perl itself.
1527
1528 =cut