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