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