c6974c112720ee498438655e57c539cd7049c9f7
[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::Exception;
7 use Carp::Clan qw/^DBIx::Class/;
8 use Try::Tiny;
9 use Scalar::Util ();
10 use File::Spec;
11 use Sub::Name ();
12 use Module::Find();
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 your
85 Result classes from a sub-namespace F<Result> under your Schema class'
86 namespace, i.e. with a Schema of I<MyDB::Schema> all files in
87 I<MyDB::Schema::Result> are assumed to be Result classes.
88
89 It also finds all ResultSet classes in the namespace F<ResultSet> and
90 loads them into the appropriate Result classes using for you. The
91 matching is done by assuming the package name of the ResultSet class
92 is the same as that of the Result class.
93
94 You will be warned if ResultSet classes are discovered for which there
95 are no matching Result classes like this:
96
97   load_namespaces found ResultSet class $classname with no corresponding Result class
98
99 If a Result class is found to already have a ResultSet class set using
100 L</resultset_class> to some other class, you will be warned like this:
101
102   We found ResultSet class '$rs_class' for '$result', but it seems 
103   that you had already set '$result' to use '$rs_set' instead
104
105 Both of the sub-namespaces are configurable if you don't like the defaults,
106 via the options C<result_namespace> and C<resultset_namespace>.
107
108 If (and only if) you specify the option C<default_resultset_class>, any found
109 Result classes for which we do not find a corresponding
110 ResultSet class will have their C<resultset_class> set to
111 C<default_resultset_class>.
112
113 All of the namespace and classname options to this method are relative to
114 the schema classname by default.  To specify a fully-qualified name, prefix
115 it with a literal C<+>.
116
117 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 If you'd like to use multiple namespaces of each type, simply use an arrayref
140 of namespaces for that option.  In the case that the same result
141 (or resultset) class exists in multiple namespaces, the latter entries in
142 your 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   my @mods = Module::Find::findallmod($ns);
170
171   # try to untaint module names. mods where this fails
172   # are left alone so we don't have to change the old behavior
173   no locale; # localized \w doesn't untaint expression
174   return map { $_ =~ m/^( (?:\w+::)* \w+ )$/x ? $1 : $_ } @mods;
175 }
176
177 # returns a hash of $shortname => $fullname for every package
178 # found in the given namespaces ($shortname is with the $fullname's
179 # namespace stripped off)
180 sub _map_namespaces {
181   my ($class, @namespaces) = @_;
182
183   my @results_hash;
184   foreach my $namespace (@namespaces) {
185     push(
186       @results_hash,
187       map { (substr($_, length "${namespace}::"), $_) }
188       $class->_findallmod($namespace)
189     );
190   }
191
192   @results_hash;
193 }
194
195 # returns the result_source_instance for the passed class/object,
196 # or dies with an informative message (used by load_namespaces)
197 sub _ns_get_rsrc_instance {
198   my $class = shift;
199   my $rs = ref ($_[0]) || $_[0];
200
201   if ($rs->can ('result_source_instance') ) {
202     return $rs->result_source_instance;
203   }
204   else {
205     $class->throw_exception (
206       "Attempt to load_namespaces() class $rs failed - are you sure this is a real Result Class?"
207     );
208   }
209 }
210
211 sub load_namespaces {
212   my ($class, %args) = @_;
213
214   my $result_namespace = delete $args{result_namespace} || 'Result';
215   my $resultset_namespace = delete $args{resultset_namespace} || 'ResultSet';
216   my $default_resultset_class = delete $args{default_resultset_class};
217
218   $class->throw_exception('load_namespaces: unknown option(s): '
219     . join(q{,}, map { qq{'$_'} } keys %args))
220       if scalar keys %args;
221
222   $default_resultset_class
223     = $class->_expand_relative_name($default_resultset_class);
224
225   for my $arg ($result_namespace, $resultset_namespace) {
226     $arg = [ $arg ] if !ref($arg) && $arg;
227
228     $class->throw_exception('load_namespaces: namespace arguments must be '
229       . 'a simple string or an arrayref')
230         if ref($arg) ne 'ARRAY';
231
232     $_ = $class->_expand_relative_name($_) for (@$arg);
233   }
234
235   my %results = $class->_map_namespaces(@$result_namespace);
236   my %resultsets = $class->_map_namespaces(@$resultset_namespace);
237
238   my @to_register;
239   {
240     no warnings 'redefine';
241     local *Class::C3::reinitialize = sub { };
242     use warnings 'redefine';
243
244     # ensure classes are loaded and attached in inheritance order
245     $class->ensure_class_loaded($_) foreach(values %results);
246     my %inh_idx;
247     my @subclass_last = sort {
248
249       ($inh_idx{$a} ||=
250         scalar @{mro::get_linear_isa( $results{$a} )}
251       )
252
253           <=>
254
255       ($inh_idx{$b} ||=
256         scalar @{mro::get_linear_isa( $results{$b} )}
257       )
258
259     } keys(%results);
260
261     foreach my $result (@subclass_last) {
262       my $result_class = $results{$result};
263
264       my $rs_class = delete $resultsets{$result};
265       my $rs_set = $class->_ns_get_rsrc_instance ($result_class)->resultset_class;
266
267       if($rs_set && $rs_set ne 'DBIx::Class::ResultSet') {
268         if($rs_class && $rs_class ne $rs_set) {
269           carp "We found ResultSet class '$rs_class' for '$result', but it seems "
270              . "that you had already set '$result' to use '$rs_set' instead";
271         }
272       }
273       elsif($rs_class ||= $default_resultset_class) {
274         $class->ensure_class_loaded($rs_class);
275         if(!$rs_class->isa("DBIx::Class::ResultSet")) {
276             carp "load_namespaces found ResultSet class $rs_class that does not subclass DBIx::Class::ResultSet";
277         }
278
279         $class->_ns_get_rsrc_instance ($result_class)->resultset_class($rs_class);
280       }
281
282       my $source_name = $class->_ns_get_rsrc_instance ($result_class)->source_name || $result;
283
284       push(@to_register, [ $source_name, $result_class ]);
285     }
286   }
287
288   foreach (sort keys %resultsets) {
289     carp "load_namespaces found ResultSet class $_ with no "
290       . 'corresponding Result class';
291   }
292
293   Class::C3->reinitialize;
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 { };
377     foreach my $prefix (keys %comps_for) {
378       foreach my $comp (@{$comps_for{$prefix}||[]}) {
379         my $comp_class = "${prefix}::${comp}";
380         $class->ensure_class_loaded($comp_class);
381
382         my $snsub = $comp_class->can('source_name');
383         if(! $snsub ) {
384           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.";
385           next;
386         }
387         $comp = $snsub->($comp_class) || $comp;
388
389         push(@to_register, [ $comp, $comp_class ]);
390       }
391     }
392   }
393   Class::C3->reinitialize;
394
395   foreach my $to (@to_register) {
396     $class->register_class(@$to);
397     #  if $class->can('result_source_instance');
398   }
399 }
400
401 =head2 storage_type
402
403 =over 4
404
405 =item Arguments: $storage_type|{$storage_type, \%args}
406
407 =item Return value: $storage_type|{$storage_type, \%args}
408
409 =item Default value: DBIx::Class::Storage::DBI
410
411 =back
412
413 Set the storage class that will be instantiated when L</connect> is called.
414 If the classname starts with C<::>, the prefix C<DBIx::Class::Storage> is
415 assumed by L</connect>.
416
417 You want to use this to set subclasses of L<DBIx::Class::Storage::DBI>
418 in cases where the appropriate subclass is not autodetected.
419
420 If your storage type requires instantiation arguments, those are
421 defined as a second argument in the form of a hashref and the entire
422 value needs to be wrapped into an arrayref or a hashref.  We support
423 both types of refs here in order to play nice with your
424 Config::[class] or your choice. See
425 L<DBIx::Class::Storage::DBI::Replicated> for an example of this.
426
427 =head2 exception_action
428
429 =over 4
430
431 =item Arguments: $code_reference
432
433 =item Return value: $code_reference
434
435 =item Default value: None
436
437 =back
438
439 If C<exception_action> is set for this class/object, L</throw_exception>
440 will prefer to call this code reference with the exception as an argument,
441 rather than L<DBIx::Class::Exception/throw>.
442
443 Your subroutine should probably just wrap the error in the exception
444 object/class of your choosing and rethrow.  If, against all sage advice,
445 you'd like your C<exception_action> to suppress a particular exception
446 completely, simply have it return true.
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    # suppress all exceptions, like a moron:
461    $schema_obj->exception_action(sub { 1 });
462
463 =head2 stacktrace
464
465 =over 4
466
467 =item Arguments: boolean
468
469 =back
470
471 Whether L</throw_exception> should include stack trace information.
472 Defaults to false normally, but defaults to true if C<$ENV{DBIC_TRACE}>
473 is true.
474
475 =head2 sqlt_deploy_hook
476
477 =over
478
479 =item Arguments: $sqlt_schema
480
481 =back
482
483 An optional sub which you can declare in your own Schema class that will get 
484 passed the L<SQL::Translator::Schema> object when you deploy the schema via
485 L</create_ddl_dir> or L</deploy>.
486
487 For an example of what you can do with this, see 
488 L<DBIx::Class::Manual::Cookbook/Adding Indexes And Functions To Your SQL>.
489
490 Note that sqlt_deploy_hook is called by L</deployment_statements>, which in turn
491 is called before L</deploy>. Therefore the hook can be used only to manipulate
492 the L<SQL::Translator::Schema> object before it is turned into SQL fed to the
493 database. If you want to execute post-deploy statements which can not be generated
494 by L<SQL::Translator>, the currently suggested method is to overload L</deploy>
495 and use L<dbh_do|DBIx::Class::Storage::DBI/dbh_do>.
496
497 =head1 METHODS
498
499 =head2 connect
500
501 =over 4
502
503 =item Arguments: @connectinfo
504
505 =item Return Value: $new_schema
506
507 =back
508
509 Creates and returns a new Schema object. The connection info set on it
510 is used to create a new instance of the storage backend and set it on
511 the Schema object.
512
513 See L<DBIx::Class::Storage::DBI/"connect_info"> for DBI-specific
514 syntax on the C<@connectinfo> argument, or L<DBIx::Class::Storage> in
515 general.
516
517 Note that C<connect_info> expects an arrayref of arguments, but
518 C<connect> does not. C<connect> wraps its arguments in an arrayref
519 before passing them to C<connect_info>.
520
521 =head3 Overloading
522
523 C<connect> is a convenience method. It is equivalent to calling
524 $schema->clone->connection(@connectinfo). To write your own overloaded
525 version, overload L</connection> instead.
526
527 =cut
528
529 sub connect { shift->clone->connection(@_) }
530
531 =head2 resultset
532
533 =over 4
534
535 =item Arguments: $source_name
536
537 =item Return Value: $resultset
538
539 =back
540
541   my $rs = $schema->resultset('DVD');
542
543 Returns the L<DBIx::Class::ResultSet> object for the registered source
544 name.
545
546 =cut
547
548 sub resultset {
549   my ($self, $moniker) = @_;
550   $self->throw_exception('resultset() expects a source name')
551     unless defined $moniker;
552   return $self->source($moniker)->resultset;
553 }
554
555 =head2 sources
556
557 =over 4
558
559 =item Return Value: @source_names
560
561 =back
562
563   my @source_names = $schema->sources;
564
565 Lists names of all the sources registered on this Schema object.
566
567 =cut
568
569 sub sources { return keys %{shift->source_registrations}; }
570
571 =head2 source
572
573 =over 4
574
575 =item Arguments: $source_name
576
577 =item Return Value: $result_source
578
579 =back
580
581   my $source = $schema->source('Book');
582
583 Returns the L<DBIx::Class::ResultSource> object for the registered
584 source name.
585
586 =cut
587
588 sub source {
589   my ($self, $moniker) = @_;
590   my $sreg = $self->source_registrations;
591   return $sreg->{$moniker} if exists $sreg->{$moniker};
592
593   # if we got here, they probably passed a full class name
594   my $mapped = $self->class_mappings->{$moniker};
595   $self->throw_exception("Can't find source for ${moniker}")
596     unless $mapped && exists $sreg->{$mapped};
597   return $sreg->{$mapped};
598 }
599
600 =head2 class
601
602 =over 4
603
604 =item Arguments: $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   my ($self, $moniker) = @_;
618   return $self->source($moniker)->result_class;
619 }
620
621 =head2 txn_do
622
623 =over 4
624
625 =item Arguments: C<$coderef>, @coderef_args?
626
627 =item Return Value: The return value of $coderef
628
629 =back
630
631 Executes C<$coderef> with (optional) arguments C<@coderef_args> atomically,
632 returning its result (if any). Equivalent to calling $schema->storage->txn_do.
633 See L<DBIx::Class::Storage/"txn_do"> for more information.
634
635 This interface is preferred over using the individual methods L</txn_begin>,
636 L</txn_commit>, and L</txn_rollback> below.
637
638 WARNING: If you are connected with C<< AutoCommit => 0 >> the transaction is
639 considered nested, and you will still need to call L</txn_commit> to write your
640 changes when appropriate. You will also want to connect with C<< auto_savepoint =>
641 1 >> to get partial rollback to work, if the storage driver for your database
642 supports it.
643
644 Connecting with C<< AutoCommit => 1 >> is recommended.
645
646 =cut
647
648 sub txn_do {
649   my $self = shift;
650
651   $self->storage or $self->throw_exception
652     ('txn_do called on $schema without storage');
653
654   $self->storage->txn_do(@_);
655 }
656
657 =head2 txn_scope_guard
658
659 Runs C<txn_scope_guard> on the schema's storage. See 
660 L<DBIx::Class::Storage/txn_scope_guard>.
661
662 =cut
663
664 sub txn_scope_guard {
665   my $self = shift;
666
667   $self->storage or $self->throw_exception
668     ('txn_scope_guard called on $schema without storage');
669
670   $self->storage->txn_scope_guard(@_);
671 }
672
673 =head2 txn_begin
674
675 Begins a transaction (does nothing if AutoCommit is off). Equivalent to
676 calling $schema->storage->txn_begin. See
677 L<DBIx::Class::Storage/"txn_begin"> for more information.
678
679 =cut
680
681 sub txn_begin {
682   my $self = shift;
683
684   $self->storage or $self->throw_exception
685     ('txn_begin called on $schema without storage');
686
687   $self->storage->txn_begin;
688 }
689
690 =head2 txn_commit
691
692 Commits the current transaction. Equivalent to calling
693 $schema->storage->txn_commit. See L<DBIx::Class::Storage/"txn_commit">
694 for more information.
695
696 =cut
697
698 sub txn_commit {
699   my $self = shift;
700
701   $self->storage or $self->throw_exception
702     ('txn_commit called on $schema without storage');
703
704   $self->storage->txn_commit;
705 }
706
707 =head2 txn_rollback
708
709 Rolls back the current transaction. Equivalent to calling
710 $schema->storage->txn_rollback. See
711 L<DBIx::Class::Storage/"txn_rollback"> for more information.
712
713 =cut
714
715 sub txn_rollback {
716   my $self = shift;
717
718   $self->storage or $self->throw_exception
719     ('txn_rollback called on $schema without storage');
720
721   $self->storage->txn_rollback;
722 }
723
724 =head2 storage
725
726   my $storage = $schema->storage;
727
728 Returns the L<DBIx::Class::Storage> object for this Schema. Grab this
729 if you want to turn on SQL statement debugging at runtime, or set the
730 quote character. For the default storage, the documentation can be
731 found in L<DBIx::Class::Storage::DBI>.
732
733 =head2 populate
734
735 =over 4
736
737 =item Arguments: $source_name, \@data;
738
739 =item Return value: \@$objects | nothing
740
741 =back
742
743 Pass this method a resultsource name, and an arrayref of
744 arrayrefs. The arrayrefs should contain a list of column names,
745 followed by one or many sets of matching data for the given columns. 
746
747 In void context, C<insert_bulk> in L<DBIx::Class::Storage::DBI> is used
748 to insert the data, as this is a fast method. However, insert_bulk currently
749 assumes that your datasets all contain the same type of values, using scalar
750 references in a column in one row, and not in another will probably not work.
751
752 Otherwise, each set of data is inserted into the database using
753 L<DBIx::Class::ResultSet/create>, and a arrayref of the resulting row
754 objects is returned.
755
756 e.g.
757
758   $schema->populate('Artist', [
759     [ qw/artistid name/ ],
760     [ 1, 'Popular Band' ],
761     [ 2, 'Indie Band' ],
762     ...
763   ]);
764
765 Since wantarray context is basically the same as looping over $rs->create(...) 
766 you won't see any performance benefits and in this case the method is more for
767 convenience. Void context sends the column information directly to storage
768 using <DBI>s bulk insert method. So the performance will be much better for 
769 storages that support this method.
770
771 Because of this difference in the way void context inserts rows into your 
772 database you need to note how this will effect any loaded components that
773 override or augment insert.  For example if you are using a component such 
774 as L<DBIx::Class::UUIDColumns> to populate your primary keys you MUST use 
775 wantarray context if you want the PKs automatically created.
776
777 =cut
778
779 sub populate {
780   my ($self, $name, $data) = @_;
781   if(my $rs = $self->resultset($name)) {
782     if(defined wantarray) {
783         return $rs->populate($data);
784     } else {
785         $rs->populate($data);
786     }
787   } else {
788       $self->throw_exception("$name is not a resultset"); 
789   }
790 }
791
792 =head2 connection
793
794 =over 4
795
796 =item Arguments: @args
797
798 =item Return Value: $new_schema
799
800 =back
801
802 Similar to L</connect> except sets the storage object and connection
803 data in-place on the Schema class. You should probably be calling
804 L</connect> to get a proper Schema object instead.
805
806 =head3 Overloading
807
808 Overload C<connection> to change the behaviour of C<connect>.
809
810 =cut
811
812 sub connection {
813   my ($self, @info) = @_;
814   return $self if !@info && $self->storage;
815
816   my ($storage_class, $args) = ref $self->storage_type ? 
817     ($self->_normalize_storage_type($self->storage_type),{}) : ($self->storage_type, {});
818
819   $storage_class = 'DBIx::Class::Storage'.$storage_class
820     if $storage_class =~ m/^::/;
821   try {
822     $self->ensure_class_loaded ($storage_class);
823   }
824   catch {
825     $self->throw_exception(
826       "No arguments to load_classes and couldn't load ${storage_class} ($_)"
827     );
828   };
829   my $storage = $storage_class->new($self=>$args);
830   $storage->connect_info(\@info);
831   $self->storage($storage);
832   return $self;
833 }
834
835 sub _normalize_storage_type {
836   my ($self, $storage_type) = @_;
837   if(ref $storage_type eq 'ARRAY') {
838     return @$storage_type;
839   } elsif(ref $storage_type eq 'HASH') {
840     return %$storage_type;
841   } else {
842     $self->throw_exception('Unsupported REFTYPE given: '. ref $storage_type);
843   }
844 }
845
846 =head2 compose_namespace
847
848 =over 4
849
850 =item Arguments: $target_namespace, $additional_base_class?
851
852 =item Retur Value: $new_schema
853
854 =back
855
856 For each L<DBIx::Class::ResultSource> in the schema, this method creates a
857 class in the target namespace (e.g. $target_namespace::CD,
858 $target_namespace::Artist) that inherits from the corresponding classes
859 attached to the current schema.
860
861 It also attaches a corresponding L<DBIx::Class::ResultSource> object to the
862 new $schema object. If C<$additional_base_class> is given, the new composed
863 classes will inherit from first the corresponding class from the current
864 schema then the base class.
865
866 For example, for a schema with My::Schema::CD and My::Schema::Artist classes,
867
868   $schema->compose_namespace('My::DB', 'Base::Class');
869   print join (', ', @My::DB::CD::ISA) . "\n";
870   print join (', ', @My::DB::Artist::ISA) ."\n";
871
872 will produce the output
873
874   My::Schema::CD, Base::Class
875   My::Schema::Artist, Base::Class
876
877 =cut
878
879 # this might be oversimplified
880 # sub compose_namespace {
881 #   my ($self, $target, $base) = @_;
882
883 #   my $schema = $self->clone;
884 #   foreach my $moniker ($schema->sources) {
885 #     my $source = $schema->source($moniker);
886 #     my $target_class = "${target}::${moniker}";
887 #     $self->inject_base(
888 #       $target_class => $source->result_class, ($base ? $base : ())
889 #     );
890 #     $source->result_class($target_class);
891 #     $target_class->result_source_instance($source)
892 #       if $target_class->can('result_source_instance');
893 #     $schema->register_source($moniker, $source);
894 #   }
895 #   return $schema;
896 # }
897
898 sub compose_namespace {
899   my ($self, $target, $base) = @_;
900   my $schema = $self->clone;
901   {
902     no warnings qw/redefine/;
903 #    local *Class::C3::reinitialize = sub { };
904     foreach my $moniker ($schema->sources) {
905       my $source = $schema->source($moniker);
906       my $target_class = "${target}::${moniker}";
907       $self->inject_base(
908         $target_class => $source->result_class, ($base ? $base : ())
909       );
910       $source->result_class($target_class);
911       $target_class->result_source_instance($source)
912         if $target_class->can('result_source_instance');
913      $schema->register_source($moniker, $source);
914     }
915   }
916 #  Class::C3->reinitialize();
917   {
918     no strict 'refs';
919     no warnings 'redefine';
920     foreach my $meth (qw/class source resultset/) {
921       *{"${target}::${meth}"} = Sub::Name::subname "${target}::${meth}" =>
922         sub { shift->schema->$meth(@_) };
923     }
924   }
925   return $schema;
926 }
927
928 sub setup_connection_class {
929   my ($class, $target, @info) = @_;
930   $class->inject_base($target => 'DBIx::Class::DB');
931   #$target->load_components('DB');
932   $target->connection(@info);
933 }
934
935 =head2 svp_begin
936
937 Creates a new savepoint (does nothing outside a transaction). 
938 Equivalent to calling $schema->storage->svp_begin.  See
939 L<DBIx::Class::Storage/"svp_begin"> for more information.
940
941 =cut
942
943 sub svp_begin {
944   my ($self, $name) = @_;
945
946   $self->storage or $self->throw_exception
947     ('svp_begin called on $schema without storage');
948
949   $self->storage->svp_begin($name);
950 }
951
952 =head2 svp_release
953
954 Releases a savepoint (does nothing outside a transaction). 
955 Equivalent to calling $schema->storage->svp_release.  See
956 L<DBIx::Class::Storage/"svp_release"> for more information.
957
958 =cut
959
960 sub svp_release {
961   my ($self, $name) = @_;
962
963   $self->storage or $self->throw_exception
964     ('svp_release called on $schema without storage');
965
966   $self->storage->svp_release($name);
967 }
968
969 =head2 svp_rollback
970
971 Rollback to a savepoint (does nothing outside a transaction). 
972 Equivalent to calling $schema->storage->svp_rollback.  See
973 L<DBIx::Class::Storage/"svp_rollback"> for more information.
974
975 =cut
976
977 sub svp_rollback {
978   my ($self, $name) = @_;
979
980   $self->storage or $self->throw_exception
981     ('svp_rollback called on $schema without storage');
982
983   $self->storage->svp_rollback($name);
984 }
985
986 =head2 clone
987
988 =over 4
989
990 =item Return Value: $new_schema
991
992 =back
993
994 Clones the schema and its associated result_source objects and returns the
995 copy.
996
997 =cut
998
999 sub clone {
1000   my ($self) = @_;
1001   my $clone = { (ref $self ? %$self : ()) };
1002   bless $clone, (ref $self || $self);
1003
1004   $clone->class_mappings({ %{$clone->class_mappings} });
1005   $clone->source_registrations({ %{$clone->source_registrations} });
1006   foreach my $moniker ($self->sources) {
1007     my $source = $self->source($moniker);
1008     my $new = $source->new($source);
1009     # we use extra here as we want to leave the class_mappings as they are
1010     # but overwrite the source_registrations entry with the new source
1011     $clone->register_extra_source($moniker => $new);
1012   }
1013   $clone->storage->set_schema($clone) if $clone->storage;
1014   return $clone;
1015 }
1016
1017 =head2 throw_exception
1018
1019 =over 4
1020
1021 =item Arguments: $message
1022
1023 =back
1024
1025 Throws an exception. Defaults to using L<Carp::Clan> to report errors from
1026 user's perspective.  See L</exception_action> for details on overriding
1027 this method's behavior.  If L</stacktrace> is turned on, C<throw_exception>'s
1028 default behavior will provide a detailed stack trace.
1029
1030 =cut
1031
1032 sub throw_exception {
1033   my $self = shift;
1034
1035   DBIx::Class::Exception->throw($_[0], $self->stacktrace)
1036     if !$self->exception_action || !$self->exception_action->(@_);
1037 }
1038
1039 =head2 deploy
1040
1041 =over 4
1042
1043 =item Arguments: \%sqlt_args, $dir
1044
1045 =back
1046
1047 Attempts to deploy the schema to the current storage using L<SQL::Translator>.
1048
1049 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
1050 The most common value for this would be C<< { add_drop_table => 1 } >>
1051 to have the SQL produced include a C<DROP TABLE> statement for each table
1052 created. For quoting purposes supply C<quote_table_names> and
1053 C<quote_field_names>.
1054
1055 Additionally, the DBIx::Class parser accepts a C<sources> parameter as a hash 
1056 ref or an array ref, containing a list of source to deploy. If present, then 
1057 only the sources listed will get deployed. Furthermore, you can use the
1058 C<add_fk_index> parser parameter to prevent the parser from creating an index for each
1059 FK.
1060
1061 =cut
1062
1063 sub deploy {
1064   my ($self, $sqltargs, $dir) = @_;
1065   $self->throw_exception("Can't deploy without storage") unless $self->storage;
1066   $self->storage->deploy($self, undef, $sqltargs, $dir);
1067 }
1068
1069 =head2 deployment_statements
1070
1071 =over 4
1072
1073 =item Arguments: See L<DBIx::Class::Storage::DBI/deployment_statements>
1074
1075 =item Return value: $listofstatements
1076
1077 =back
1078
1079 A convenient shortcut to
1080 C<< $self->storage->deployment_statements($self, @args) >>.
1081 Returns the SQL statements used by L</deploy> and
1082 L<DBIx::Class::Schema::Storage/deploy>.
1083
1084 =cut
1085
1086 sub deployment_statements {
1087   my $self = shift;
1088
1089   $self->throw_exception("Can't generate deployment statements without a storage")
1090     if not $self->storage;
1091
1092   $self->storage->deployment_statements($self, @_);
1093 }
1094
1095 =head2 create_ddl_dir
1096
1097 =over 4
1098
1099 =item Arguments: See L<DBIx::Class::Storage::DBI/create_ddl_dir>
1100
1101 =back
1102
1103 A convenient shortcut to 
1104 C<< $self->storage->create_ddl_dir($self, @args) >>.
1105
1106 Creates an SQL file based on the Schema, for each of the specified
1107 database types, in the given directory.
1108
1109 =cut
1110
1111 sub create_ddl_dir {
1112   my $self = shift;
1113
1114   $self->throw_exception("Can't create_ddl_dir without storage") unless $self->storage;
1115   $self->storage->create_ddl_dir($self, @_);
1116 }
1117
1118 =head2 ddl_filename
1119
1120 =over 4
1121
1122 =item Arguments: $database-type, $version, $directory, $preversion
1123
1124 =item Return value: $normalised_filename
1125
1126 =back
1127
1128   my $filename = $table->ddl_filename($type, $version, $dir, $preversion)
1129
1130 This method is called by C<create_ddl_dir> to compose a file name out of
1131 the supplied directory, database type and version number. The default file
1132 name format is: C<$dir$schema-$version-$type.sql>.
1133
1134 You may override this method in your schema if you wish to use a different
1135 format.
1136
1137  WARNING
1138
1139  Prior to DBIx::Class version 0.08100 this method had a different signature:
1140
1141     my $filename = $table->ddl_filename($type, $dir, $version, $preversion)
1142
1143  In recent versions variables $dir and $version were reversed in order to
1144  bring the signature in line with other Schema/Storage methods. If you 
1145  really need to maintain backward compatibility, you can do the following
1146  in any overriding methods:
1147
1148     ($dir, $version) = ($version, $dir) if ($DBIx::Class::VERSION < 0.08100);
1149
1150 =cut
1151
1152 sub ddl_filename {
1153   my ($self, $type, $version, $dir, $preversion) = @_;
1154
1155   my $filename = ref($self);
1156   $filename =~ s/::/-/g;
1157   $filename = File::Spec->catfile($dir, "$filename-$version-$type.sql");
1158   $filename =~ s/$version/$preversion-$version/ if($preversion);
1159
1160   return $filename;
1161 }
1162
1163 =head2 thaw
1164
1165 Provided as the recommended way of thawing schema objects. You can call 
1166 C<Storable::thaw> directly if you wish, but the thawed objects will not have a
1167 reference to any schema, so are rather useless.
1168
1169 =cut
1170
1171 sub thaw {
1172   my ($self, $obj) = @_;
1173   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1174   return Storable::thaw($obj);
1175 }
1176
1177 =head2 freeze
1178
1179 This doesn't actually do anything more than call L<Storable/freeze>, it is just
1180 provided here for symmetry.
1181
1182 =cut
1183
1184 sub freeze {
1185   return Storable::freeze($_[1]);
1186 }
1187
1188 =head2 dclone
1189
1190 =over 4
1191
1192 =item Arguments: $object
1193
1194 =item Return Value: dcloned $object
1195
1196 =back
1197
1198 Recommended way of dcloning L<DBIx::Class::Row> and L<DBIx::Class::ResultSet>
1199 objects so their references to the schema object
1200 (which itself is B<not> cloned) are properly maintained.
1201
1202 =cut
1203
1204 sub dclone {
1205   my ($self, $obj) = @_;
1206   local $DBIx::Class::ResultSourceHandle::thaw_schema = $self;
1207   return Storable::dclone($obj);
1208 }
1209
1210 =head2 schema_version
1211
1212 Returns the current schema class' $VERSION in a normalised way.
1213
1214 =cut
1215
1216 sub schema_version {
1217   my ($self) = @_;
1218   my $class = ref($self)||$self;
1219
1220   # does -not- use $schema->VERSION
1221   # since that varies in results depending on if version.pm is installed, and if
1222   # so the perl or XS versions. If you want this to change, bug the version.pm
1223   # author to make vpp and vxs behave the same.
1224
1225   my $version;
1226   {
1227     no strict 'refs';
1228     $version = ${"${class}::VERSION"};
1229   }
1230   return $version;
1231 }
1232
1233
1234 =head2 register_class
1235
1236 =over 4
1237
1238 =item Arguments: $moniker, $component_class
1239
1240 =back
1241
1242 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. 
1243
1244 You will only need this method if you have your Result classes in
1245 files which are not named after the packages (or all in the same
1246 file). You may also need it to register classes at runtime.
1247
1248 Registers a class which isa DBIx::Class::ResultSourceProxy. Equivalent to
1249 calling:
1250
1251   $schema->register_source($moniker, $component_class->result_source_instance);
1252
1253 =cut
1254
1255 sub register_class {
1256   my ($self, $moniker, $to_register) = @_;
1257   $self->register_source($moniker => $to_register->result_source_instance);
1258 }
1259
1260 =head2 register_source
1261
1262 =over 4
1263
1264 =item Arguments: $moniker, $result_source
1265
1266 =back
1267
1268 This method is called by L</register_class>.
1269
1270 Registers the L<DBIx::Class::ResultSource> in the schema with the given
1271 moniker.
1272
1273 =cut
1274
1275 sub register_source {
1276   my $self = shift;
1277
1278   $self->_register_source(@_);
1279 }
1280
1281 =head2 unregister_source
1282
1283 =over 4
1284
1285 =item Arguments: $moniker
1286
1287 =back
1288
1289 Removes the L<DBIx::Class::ResultSource> from the schema for the given moniker.
1290
1291 =cut
1292
1293 sub unregister_source {
1294   my $self = shift;
1295
1296   $self->_unregister_source(@_);
1297 }
1298
1299 =head2 register_extra_source
1300
1301 =over 4
1302
1303 =item Arguments: $moniker, $result_source
1304
1305 =back
1306
1307 As L</register_source> but should be used if the result class already 
1308 has a source and you want to register an extra one.
1309
1310 =cut
1311
1312 sub register_extra_source {
1313   my $self = shift;
1314
1315   $self->_register_source(@_, { extra => 1 });
1316 }
1317
1318 sub _register_source {
1319   my ($self, $moniker, $source, $params) = @_;
1320
1321   my $orig_source = $source;
1322
1323   $source = $source->new({ %$source, source_name => $moniker });
1324   $source->schema($self);
1325   Scalar::Util::weaken($source->{schema}) if ref($self);
1326
1327   my $rs_class = $source->result_class;
1328
1329   my %reg = %{$self->source_registrations};
1330   $reg{$moniker} = $source;
1331   $self->source_registrations(\%reg);
1332
1333   return if ($params->{extra});
1334   return unless defined($rs_class) && $rs_class->can('result_source_instance');
1335
1336   my %map = %{$self->class_mappings};
1337   if (
1338     exists $map{$rs_class}
1339       and
1340     $map{$rs_class} ne $moniker
1341       and
1342     $rs_class->result_source_instance ne $orig_source
1343   ) {
1344     carp "$rs_class already has a source, use register_extra_source for additional sources";
1345   }
1346   $map{$rs_class} = $moniker;
1347   $self->class_mappings(\%map);
1348 }
1349
1350 sub _unregister_source {
1351     my ($self, $moniker) = @_;
1352     my %reg = %{$self->source_registrations}; 
1353
1354     my $source = delete $reg{$moniker};
1355     $self->source_registrations(\%reg);
1356     if ($source->result_class) {
1357         my %map = %{$self->class_mappings};
1358         delete $map{$source->result_class};
1359         $self->class_mappings(\%map);
1360     }
1361 }
1362
1363
1364 =head2 compose_connection (DEPRECATED)
1365
1366 =over 4
1367
1368 =item Arguments: $target_namespace, @db_info
1369
1370 =item Return Value: $new_schema
1371
1372 =back
1373
1374 DEPRECATED. You probably wanted compose_namespace.
1375
1376 Actually, you probably just wanted to call connect.
1377
1378 =begin hidden
1379
1380 (hidden due to deprecation)
1381
1382 Calls L<DBIx::Class::Schema/"compose_namespace"> to the target namespace,
1383 calls L<DBIx::Class::Schema/connection> with @db_info on the new schema,
1384 then injects the L<DBix::Class::ResultSetProxy> component and a
1385 resultset_instance classdata entry on all the new classes, in order to support
1386 $target_namespaces::$class->search(...) method calls.
1387
1388 This is primarily useful when you have a specific need for class method access
1389 to a connection. In normal usage it is preferred to call
1390 L<DBIx::Class::Schema/connect> and use the resulting schema object to operate
1391 on L<DBIx::Class::ResultSet> objects with L<DBIx::Class::Schema/resultset> for
1392 more information.
1393
1394 =end hidden
1395
1396 =cut
1397
1398 {
1399   my $warn;
1400
1401   sub compose_connection {
1402     my ($self, $target, @info) = @_;
1403
1404     carp "compose_connection deprecated as of 0.08000"
1405       unless ($INC{"DBIx/Class/CDBICompat.pm"} || $warn++);
1406
1407     my $base = 'DBIx::Class::ResultSetProxy';
1408     try {
1409       eval "require ${base};"
1410     }
1411     catch {
1412       $self->throw_exception
1413         ("No arguments to load_classes and couldn't load ${base} ($_)")
1414     };
1415
1416     if ($self eq $target) {
1417       # Pathological case, largely caused by the docs on early C::M::DBIC::Plain
1418       foreach my $moniker ($self->sources) {
1419         my $source = $self->source($moniker);
1420         my $class = $source->result_class;
1421         $self->inject_base($class, $base);
1422         $class->mk_classdata(resultset_instance => $source->resultset);
1423         $class->mk_classdata(class_resolver => $self);
1424       }
1425       $self->connection(@info);
1426       return $self;
1427     }
1428
1429     my $schema = $self->compose_namespace($target, $base);
1430     {
1431       no strict 'refs';
1432       my $name = join '::', $target, 'schema';
1433       *$name = Sub::Name::subname $name, sub { $schema };
1434     }
1435
1436     $schema->connection(@info);
1437     foreach my $moniker ($schema->sources) {
1438       my $source = $schema->source($moniker);
1439       my $class = $source->result_class;
1440       #warn "$moniker $class $source ".$source->storage;
1441       $class->mk_classdata(result_source_instance => $source);
1442       $class->mk_classdata(resultset_instance => $source->resultset);
1443       $class->mk_classdata(class_resolver => $schema);
1444     }
1445     return $schema;
1446   }
1447 }
1448
1449 1;
1450
1451 =head1 AUTHORS
1452
1453 Matt S. Trout <mst@shadowcatsystems.co.uk>
1454
1455 =head1 LICENSE
1456
1457 You may distribute this code under the same terms as Perl itself.
1458
1459 =cut