File Coverage

blib/lib/DBIx/Class/Schema.pm
Criterion Covered Total %
statement 328 353 92.9
branch 80 108 74.0
condition 48 73 65.7
subroutine 63 70 90.0
pod 33 34 97.0
total 552 638 86.5


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