Documentation updates
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSource.pm
CommitLineData
9c992ba1 1package DBIx::Class::ResultSource;
2
3use strict;
4use warnings;
5
6use DBIx::Class::ResultSet;
701da8c4 7use Carp::Clan qw/^DBIx::Class/;
6da5894c 8use Storable;
9
9c992ba1 10use base qw/DBIx::Class/;
11__PACKAGE__->load_components(qw/AccessorGroup/);
12
aa1088bf 13__PACKAGE__->mk_group_accessors('simple' => qw/_ordered_columns
14 _columns _primaries _unique_constraints name resultset_attributes
15 schema from _relationships/);
16
17__PACKAGE__->mk_group_accessors('component_class' => qw/resultset_class
18 result_class/);
9c992ba1 19
75d07914 20=head1 NAME
9c992ba1 21
22DBIx::Class::ResultSource - Result source object
23
24=head1 SYNOPSIS
25
26=head1 DESCRIPTION
27
28A ResultSource is a component of a schema from which results can be directly
29retrieved, most usually a table (see L<DBIx::Class::ResultSource::Table>)
30
31=head1 METHODS
32
33=cut
34
35sub new {
36 my ($class, $attrs) = @_;
37 $class = ref $class if ref $class;
1225fc4d 38 my $new = bless({ %{$attrs || {}}, _resultset => undef }, $class);
9c992ba1 39 $new->{resultset_class} ||= 'DBIx::Class::ResultSet';
5ac6a044 40 $new->{resultset_attributes} = { %{$new->{resultset_attributes} || {}} };
6da5894c 41 $new->{_ordered_columns} = [ @{$new->{_ordered_columns}||[]}];
42 $new->{_columns} = { %{$new->{_columns}||{}} };
43 $new->{_relationships} = { %{$new->{_relationships}||{}} };
9c992ba1 44 $new->{name} ||= "!!NAME NOT SET!!";
5afa2a15 45 $new->{_columns_info_loaded} ||= 0;
9c992ba1 46 return $new;
47}
48
988bf309 49=pod
50
5ac6a044 51=head2 add_columns
52
53 $table->add_columns(qw/col1 col2 col3/);
54
55 $table->add_columns('col1' => \%col1_info, 'col2' => \%col2_info, ...);
56
2053ab2a 57Adds columns to the result source. If supplied key => hashref pairs, uses
58the hashref as the column_info for that column. Repeated calls of this
59method will add more columns, not replace them.
5ac6a044 60
2053ab2a 61The contents of the column_info are not set in stone. The following
62keys are currently recognised/used by DBIx::Class:
988bf309 63
64=over 4
65
75d07914 66=item accessor
988bf309 67
68Use this to set the name of the accessor for this column. If unset,
69the name of the column will be used.
70
71=item data_type
72
2053ab2a 73This contains the column type. It is automatically filled by the
988bf309 74L<SQL::Translator::Producer::DBIx::Class::File> producer, and the
2053ab2a 75L<DBIx::Class::Schema::Loader> module. If you do not enter a
988bf309 76data_type, DBIx::Class will attempt to retrieve it from the
2053ab2a 77database for you, using L<DBI>'s column_info method. The values of this
988bf309 78key are typically upper-cased.
79
2053ab2a 80Currently there is no standard set of values for the data_type. Use
81whatever your database supports.
988bf309 82
83=item size
84
85The length of your column, if it is a column type that can have a size
75d07914 86restriction. This is currently not used by DBIx::Class.
988bf309 87
88=item is_nullable
89
2053ab2a 90Set this to a true value for a columns that is allowed to contain
91NULL values. This is currently not used by DBIx::Class.
988bf309 92
93=item is_auto_increment
94
2053ab2a 95Set this to a true value for a column whose value is somehow
96automatically set. This is used to determine which columns to empty
e666492c 97when cloning objects using C<copy>.
988bf309 98
99=item is_foreign_key
100
2053ab2a 101Set this to a true value for a column that contains a key from a
988bf309 102foreign table. This is currently not used by DBIx::Class.
103
104=item default_value
105
2053ab2a 106Set this to the default value which will be inserted into a column
107by the database. Can contain either a value or a function. This is
75d07914 108currently not used by DBIx::Class.
988bf309 109
110=item sequence
111
2053ab2a 112Set this on a primary key column to the name of the sequence used to
113generate a new key value. If not specified, L<DBIx::Class::PK::Auto>
114will attempt to retrieve the name of the sequence from the database
115automatically.
988bf309 116
117=back
118
5ac6a044 119=head2 add_column
120
121 $table->add_column('col' => \%info?);
122
2053ab2a 123Convenience alias to add_columns.
5ac6a044 124
125=cut
126
9c992ba1 127sub add_columns {
128 my ($self, @cols) = @_;
8e04bf91 129 $self->_ordered_columns(\@cols) unless $self->_ordered_columns;
130
20518cb4 131 my @added;
132 my $columns = $self->_columns;
9c992ba1 133 while (my $col = shift @cols) {
8e04bf91 134 # If next entry is { ... } use that for the column info, if not
135 # use an empty hashref
30126ac7 136 my $column_info = ref $cols[0] ? shift(@cols) : {};
20518cb4 137 push(@added, $col) unless exists $columns->{$col};
20518cb4 138 $columns->{$col} = $column_info;
9c992ba1 139 }
20518cb4 140 push @{ $self->_ordered_columns }, @added;
30126ac7 141 return $self;
9c992ba1 142}
143
144*add_column = \&add_columns;
145
3842b955 146=head2 has_column
147
988bf309 148 if ($obj->has_column($col)) { ... }
149
2053ab2a 150Returns true if the source has a column of this name, false otherwise.
988bf309 151
152=cut
9c992ba1 153
154sub has_column {
155 my ($self, $column) = @_;
156 return exists $self->_columns->{$column};
157}
158
87c4e602 159=head2 column_info
9c992ba1 160
988bf309 161 my $info = $obj->column_info($col);
9c992ba1 162
988bf309 163Returns the column metadata hashref for a column. See the description
164of add_column for information on the contents of the hashref.
9c992ba1 165
988bf309 166=cut
9c992ba1 167
168sub column_info {
169 my ($self, $column) = @_;
75d07914 170 $self->throw_exception("No such column $column")
701da8c4 171 unless exists $self->_columns->{$column};
5afa2a15 172 #warn $self->{_columns_info_loaded}, "\n";
75d07914 173 if ( ! $self->_columns->{$column}{data_type}
174 and ! $self->{_columns_info_loaded}
8e04bf91 175 and $self->schema and $self->storage )
176 {
177 $self->{_columns_info_loaded}++;
178 my $info;
75d07914 179 # eval for the case of storage without table
8e04bf91 180 eval { $info = $self->storage->columns_info_for($self->from) };
181 unless ($@) {
182 foreach my $col ( keys %{$self->_columns} ) {
183 foreach my $i ( keys %{$info->{$col}} ) {
184 $self->_columns->{$col}{$i} = $info->{$col}{$i};
185 }
a953d8d9 186 }
8e04bf91 187 }
a953d8d9 188 }
9c992ba1 189 return $self->_columns->{$column};
190}
191
192=head2 columns
193
20518cb4 194 my @column_names = $obj->columns;
195
2053ab2a 196Returns all column names in the order they were declared to add_columns.
87f0da6a 197
198=cut
9c992ba1 199
200sub columns {
8e04bf91 201 my $self = shift;
aa1088bf 202 $self->throw_exception(
203 "columns() is a read-only accessor, did you mean add_columns()?"
204 ) if (@_ > 1);
701da8c4 205 return @{$self->{_ordered_columns}||[]};
571dced3 206}
207
87c4e602 208=head2 set_primary_key
209
27f01d1f 210=over 4
211
ebc77b53 212=item Arguments: @cols
27f01d1f 213
214=back
87f0da6a 215
9c992ba1 216Defines one or more columns as primary key for this source. Should be
217called after C<add_columns>.
87f0da6a 218
219Additionally, defines a unique constraint named C<primary>.
220
988bf309 221The primary key columns are used by L<DBIx::Class::PK::Auto> to
75d07914 222retrieve automatically created values from the database.
988bf309 223
87f0da6a 224=cut
9c992ba1 225
226sub set_primary_key {
227 my ($self, @cols) = @_;
228 # check if primary key columns are valid columns
8e04bf91 229 foreach my $col (@cols) {
230 $self->throw_exception("No such column $col on table " . $self->name)
231 unless $self->has_column($col);
9c992ba1 232 }
233 $self->_primaries(\@cols);
87f0da6a 234
235 $self->add_unique_constraint(primary => \@cols);
9c992ba1 236}
237
87f0da6a 238=head2 primary_columns
239
9c992ba1 240Read-only accessor which returns the list of primary keys.
30126ac7 241
87f0da6a 242=cut
9c992ba1 243
244sub primary_columns {
245 return @{shift->_primaries||[]};
246}
247
87f0da6a 248=head2 add_unique_constraint
249
250Declare a unique constraint on this source. Call once for each unique
988bf309 251constraint. Unique constraints are used when you call C<find> on a
2053ab2a 252L<DBIx::Class::ResultSet>. Only columns in the constraint are searched,
253for example:
27f01d1f 254
255 # For UNIQUE (column1, column2)
256 __PACKAGE__->add_unique_constraint(
257 constraint_name => [ qw/column1 column2/ ],
258 );
87f0da6a 259
260=cut
261
262sub add_unique_constraint {
263 my ($self, $name, $cols) = @_;
264
8e04bf91 265 foreach my $col (@$cols) {
266 $self->throw_exception("No such column $col on table " . $self->name)
267 unless $self->has_column($col);
87f0da6a 268 }
269
270 my %unique_constraints = $self->unique_constraints;
271 $unique_constraints{$name} = $cols;
272 $self->_unique_constraints(\%unique_constraints);
273}
274
275=head2 unique_constraints
276
277Read-only accessor which returns the list of unique constraints on this source.
278
279=cut
280
281sub unique_constraints {
282 return %{shift->_unique_constraints||{}};
283}
284
9c992ba1 285=head2 from
286
287Returns an expression of the source to be supplied to storage to specify
2053ab2a 288retrieval from this source. In the case of a database, the required FROM
289clause contents.
9c992ba1 290
f9b7bd6e 291=head2 schema
292
293Returns the L<DBIx::Class::Schema> object that this result source
294belongs too.
9c992ba1 295
296=head2 storage
297
75d07914 298Returns the storage handle for the current schema.
988bf309 299
300See also: L<DBIx::Class::Storage>
9c992ba1 301
302=cut
303
304sub storage { shift->schema->storage; }
305
8452e496 306=head2 add_relationship
307
308 $source->add_relationship('relname', 'related_source', $cond, $attrs);
309
24d67825 310The relationship name can be arbitrary, but must be unique for each
311relationship attached to this result source. 'related_source' should
312be the name with which the related result source was registered with
313the current schema. For example:
8452e496 314
24d67825 315 $schema->source('Book')->add_relationship('reviews', 'Review', {
316 'foreign.book_id' => 'self.id',
317 });
318
2053ab2a 319The condition C<$cond> needs to be an L<SQL::Abstract>-style
24d67825 320representation of the join between the tables. For example, if you're
321creating a rel from Author to Book,
988bf309 322
323 { 'foreign.author_id' => 'self.id' }
324
325will result in the JOIN clause
326
327 author me JOIN book foreign ON foreign.author_id = me.id
328
8452e496 329You can specify as many foreign => self mappings as necessary.
330
988bf309 331Valid attributes are as follows:
332
333=over 4
334
335=item join_type
336
337Explicitly specifies the type of join to use in the relationship. Any
338SQL join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in
339the SQL command immediately before C<JOIN>.
340
341=item proxy
342
24d67825 343An arrayref containing a list of accessors in the foreign class to proxy in
344the main class. If, for example, you do the following:
345
346 CD->might_have(liner_notes => 'LinerNotes', undef, {
347 proxy => [ qw/notes/ ],
348 });
349
350Then, assuming LinerNotes has an accessor named notes, you can do:
988bf309 351
24d67825 352 my $cd = CD->find(1);
2053ab2a 353 # set notes -- LinerNotes object is created if it doesn't exist
354 $cd->notes('Notes go here');
988bf309 355
356=item accessor
357
358Specifies the type of accessor that should be created for the
75d07914 359relationship. Valid values are C<single> (for when there is only a single
360related object), C<multi> (when there can be many), and C<filter> (for
361when there is a single related object, but you also want the relationship
362accessor to double as a column accessor). For C<multi> accessors, an
363add_to_* method is also created, which calls C<create_related> for the
988bf309 364relationship.
365
8452e496 366=back
367
368=cut
369
370sub add_relationship {
371 my ($self, $rel, $f_source_name, $cond, $attrs) = @_;
27f01d1f 372 $self->throw_exception("Can't create relationship without join condition")
373 unless $cond;
8452e496 374 $attrs ||= {};
87772e46 375
8452e496 376 my %rels = %{ $self->_relationships };
377 $rels{$rel} = { class => $f_source_name,
87772e46 378 source => $f_source_name,
8452e496 379 cond => $cond,
380 attrs => $attrs };
381 $self->_relationships(\%rels);
382
30126ac7 383 return $self;
87772e46 384
953a18ef 385 # XXX disabled. doesn't work properly currently. skip in tests.
386
8452e496 387 my $f_source = $self->schema->source($f_source_name);
388 unless ($f_source) {
389 eval "require $f_source_name;";
390 if ($@) {
391 die $@ unless $@ =~ /Can't locate/;
392 }
393 $f_source = $f_source_name->result_source;
87772e46 394 #my $s_class = ref($self->schema);
395 #$f_source_name =~ m/^${s_class}::(.*)$/;
396 #$self->schema->register_class(($1 || $f_source_name), $f_source_name);
397 #$f_source = $self->schema->source($f_source_name);
8452e496 398 }
399 return unless $f_source; # Can't test rel without f_source
400
401 eval { $self->resolve_join($rel, 'me') };
402
403 if ($@) { # If the resolve failed, back out and re-throw the error
75d07914 404 delete $rels{$rel}; #
8452e496 405 $self->_relationships(\%rels);
701da8c4 406 $self->throw_exception("Error creating relationship $rel: $@");
8452e496 407 }
408 1;
409}
410
87c4e602 411=head2 relationships
8452e496 412
2053ab2a 413Returns all relationship names for this source.
8452e496 414
415=cut
416
417sub relationships {
418 return keys %{shift->_relationships};
419}
420
87c4e602 421=head2 relationship_info
422
27f01d1f 423=over 4
424
ebc77b53 425=item Arguments: $relname
27f01d1f 426
427=back
8452e496 428
2053ab2a 429Returns a hash of relationship information for the specified relationship
430name.
8452e496 431
432=cut
433
434sub relationship_info {
435 my ($self, $rel) = @_;
436 return $self->_relationships->{$rel};
75d07914 437}
8452e496 438
87c4e602 439=head2 has_relationship
440
27f01d1f 441=over 4
442
ebc77b53 443=item Arguments: $rel
27f01d1f 444
445=back
953a18ef 446
2053ab2a 447Returns true if the source has a relationship of this name, false otherwise.
988bf309 448
449=cut
953a18ef 450
451sub has_relationship {
452 my ($self, $rel) = @_;
453 return exists $self->_relationships->{$rel};
454}
455
87c4e602 456=head2 resolve_join
457
27f01d1f 458=over 4
459
ebc77b53 460=item Arguments: $relation
27f01d1f 461
462=back
8452e496 463
2053ab2a 464Returns the join structure required for the related result source.
8452e496 465
466=cut
467
468sub resolve_join {
489709af 469 my ($self, $join, $alias, $seen) = @_;
470 $seen ||= {};
87772e46 471 if (ref $join eq 'ARRAY') {
489709af 472 return map { $self->resolve_join($_, $alias, $seen) } @$join;
87772e46 473 } elsif (ref $join eq 'HASH') {
489709af 474 return
887ce227 475 map {
476 my $as = ($seen->{$_} ? $_.'_'.($seen->{$_}+1) : $_);
477 ($self->resolve_join($_, $alias, $seen),
478 $self->related_source($_)->resolve_join($join->{$_}, $as, $seen));
479 } keys %$join;
87772e46 480 } elsif (ref $join) {
701da8c4 481 $self->throw_exception("No idea how to resolve join reftype ".ref $join);
87772e46 482 } else {
489709af 483 my $count = ++$seen->{$join};
484 #use Data::Dumper; warn Dumper($seen);
485 my $as = ($count > 1 ? "${join}_${count}" : $join);
3842b955 486 my $rel_info = $self->relationship_info($join);
701da8c4 487 $self->throw_exception("No such relationship ${join}") unless $rel_info;
3842b955 488 my $type = $rel_info->{attrs}{join_type} || '';
489709af 489 return [ { $as => $self->related_source($join)->from,
953a18ef 490 -join_type => $type },
489709af 491 $self->resolve_condition($rel_info->{cond}, $as, $alias) ];
953a18ef 492 }
493}
494
87c4e602 495=head2 resolve_condition
496
27f01d1f 497=over 4
498
ebc77b53 499=item Arguments: $cond, $as, $alias|$object
27f01d1f 500
501=back
953a18ef 502
3842b955 503Resolves the passed condition to a concrete query fragment. If given an alias,
953a18ef 504returns a join condition; if given an object, inverts that object to produce
505a related conditional from that object.
506
507=cut
508
509sub resolve_condition {
489709af 510 my ($self, $cond, $as, $for) = @_;
953a18ef 511 #warn %$cond;
512 if (ref $cond eq 'HASH') {
513 my %ret;
bd054cb4 514 foreach my $k (keys %{$cond}) {
515 my $v = $cond->{$k};
953a18ef 516 # XXX should probably check these are valid columns
27f01d1f 517 $k =~ s/^foreign\.// ||
75d07914 518 $self->throw_exception("Invalid rel cond key ${k}");
27f01d1f 519 $v =~ s/^self\.// ||
75d07914 520 $self->throw_exception("Invalid rel cond val ${v}");
953a18ef 521 if (ref $for) { # Object
3842b955 522 #warn "$self $k $for $v";
523 $ret{$k} = $for->get_column($v);
524 #warn %ret;
2c037e6b 525 } elsif (!defined $for) { # undef, i.e. "no object"
526 $ret{$k} = undef;
fde6e28e 527 } elsif (ref $as) { # reverse object
528 $ret{$v} = $as->get_column($k);
2c037e6b 529 } elsif (!defined $as) { # undef, i.e. "no reverse object"
530 $ret{$v} = undef;
953a18ef 531 } else {
489709af 532 $ret{"${as}.${k}"} = "${for}.${v}";
953a18ef 533 }
953a18ef 534 }
535 return \%ret;
5efe4c79 536 } elsif (ref $cond eq 'ARRAY') {
489709af 537 return [ map { $self->resolve_condition($_, $as, $for) } @$cond ];
953a18ef 538 } else {
539 die("Can't handle this yet :(");
87772e46 540 }
541}
542
87c4e602 543=head2 resolve_prefetch
544
27f01d1f 545=over 4
546
ebc77b53 547=item Arguments: hashref/arrayref/scalar
27f01d1f 548
549=back
988bf309 550
b3e8ac9b 551Accepts one or more relationships for the current source and returns an
552array of column names for each of those relationships. Column names are
553prefixed relative to the current source, in accordance with where they appear
554in the supplied relationships. Examples:
555
5ac6a044 556 my $source = $schema->resultset('Tag')->source;
b3e8ac9b 557 @columns = $source->resolve_prefetch( { cd => 'artist' } );
558
559 # @columns =
560 #(
561 # 'cd.cdid',
562 # 'cd.artist',
563 # 'cd.title',
564 # 'cd.year',
565 # 'cd.artist.artistid',
566 # 'cd.artist.name'
567 #)
568
569 @columns = $source->resolve_prefetch( qw[/ cd /] );
570
571 # @columns =
572 #(
573 # 'cd.cdid',
574 # 'cd.artist',
575 # 'cd.title',
576 # 'cd.year'
577 #)
578
579 $source = $schema->resultset('CD')->source;
580 @columns = $source->resolve_prefetch( qw[/ artist producer /] );
581
582 # @columns =
583 #(
584 # 'artist.artistid',
585 # 'artist.name',
586 # 'producer.producerid',
587 # 'producer.name'
75d07914 588 #)
988bf309 589
b3e8ac9b 590=cut
591
592sub resolve_prefetch {
0f66a01b 593 my ($self, $pre, $alias, $seen, $order, $collapse) = @_;
489709af 594 $seen ||= {};
b3e8ac9b 595 #$alias ||= $self->name;
596 #warn $alias, Dumper $pre;
597 if( ref $pre eq 'ARRAY' ) {
0f66a01b 598 return
599 map { $self->resolve_prefetch( $_, $alias, $seen, $order, $collapse ) }
600 @$pre;
b3e8ac9b 601 }
602 elsif( ref $pre eq 'HASH' ) {
603 my @ret =
604 map {
0f66a01b 605 $self->resolve_prefetch($_, $alias, $seen, $order, $collapse),
489709af 606 $self->related_source($_)->resolve_prefetch(
0f66a01b 607 $pre->{$_}, "${alias}.$_", $seen, $order, $collapse)
608 } keys %$pre;
b3e8ac9b 609 #die Dumper \@ret;
610 return @ret;
611 }
612 elsif( ref $pre ) {
a86b1efe 613 $self->throw_exception(
614 "don't know how to resolve prefetch reftype ".ref($pre));
b3e8ac9b 615 }
616 else {
489709af 617 my $count = ++$seen->{$pre};
618 my $as = ($count > 1 ? "${pre}_${count}" : $pre);
b3e8ac9b 619 my $rel_info = $self->relationship_info( $pre );
a86b1efe 620 $self->throw_exception( $self->name . " has no such relationship '$pre'" )
621 unless $rel_info;
37f23589 622 my $as_prefix = ($alias =~ /^.*?\.(.+)$/ ? $1.'.' : '');
a86b1efe 623 my $rel_source = $self->related_source($pre);
0f66a01b 624
625 if (exists $rel_info->{attrs}{accessor}
626 && $rel_info->{attrs}{accessor} eq 'multi') {
627 $self->throw_exception(
628 "Can't prefetch has_many ${pre} (join cond too complex)")
629 unless ref($rel_info->{cond}) eq 'HASH';
37f23589 630 my @key = map { (/^foreign\.(.+)$/ ? ($1) : ()); }
0f66a01b 631 keys %{$rel_info->{cond}};
632 $collapse->{"${as_prefix}${pre}"} = \@key;
5a5bec6c 633 my @ord = (ref($rel_info->{attrs}{order_by}) eq 'ARRAY'
634 ? @{$rel_info->{attrs}{order_by}}
635 : (defined $rel_info->{attrs}{order_by}
636 ? ($rel_info->{attrs}{order_by})
637 : ()));
638 push(@$order, map { "${as}.$_" } (@key, @ord));
0f66a01b 639 }
640
489709af 641 return map { [ "${as}.$_", "${as_prefix}${pre}.$_", ] }
a86b1efe 642 $rel_source->columns;
b3e8ac9b 643 #warn $alias, Dumper (\@ret);
489709af 644 #return @ret;
b3e8ac9b 645 }
646}
953a18ef 647
87c4e602 648=head2 related_source
649
27f01d1f 650=over 4
651
ebc77b53 652=item Arguments: $relname
27f01d1f 653
654=back
87772e46 655
2053ab2a 656Returns the result source object for the given relationship.
87772e46 657
658=cut
659
660sub related_source {
661 my ($self, $rel) = @_;
aea52c85 662 if( !$self->has_relationship( $rel ) ) {
701da8c4 663 $self->throw_exception("No such relationship '$rel'");
aea52c85 664 }
87772e46 665 return $self->schema->source($self->relationship_info($rel)->{source});
8452e496 666}
667
77254782 668=head2 related_class
669
27f01d1f 670=over 4
671
ebc77b53 672=item Arguments: $relname
27f01d1f 673
674=back
77254782 675
2053ab2a 676Returns the class name for objects in the given relationship.
77254782 677
678=cut
679
680sub related_class {
681 my ($self, $rel) = @_;
682 if( !$self->has_relationship( $rel ) ) {
683 $self->throw_exception("No such relationship '$rel'");
684 }
685 return $self->schema->class($self->relationship_info($rel)->{source});
686}
687
5ac6a044 688=head2 resultset
689
bcc5a210 690Returns a resultset for the given source. This will initially be created
691on demand by calling
5ac6a044 692
988bf309 693 $self->resultset_class->new($self, $self->resultset_attributes)
5ac6a044 694
bcc5a210 695but is cached from then on unless resultset_class changes.
696
5ac6a044 697=head2 resultset_class
698
988bf309 699Set the class of the resultset, this is useful if you want to create your
700own resultset methods. Create your own class derived from
701L<DBIx::Class::ResultSet>, and set it here.
5ac6a044 702
703=head2 resultset_attributes
704
988bf309 705Specify here any attributes you wish to pass to your specialised resultset.
5ac6a044 706
707=cut
708
709sub resultset {
710 my $self = shift;
27f01d1f 711 $self->throw_exception(
712 'resultset does not take any arguments. If you want another resultset, '.
713 'call it on the schema instead.'
714 ) if scalar @_;
428c2b82 715
716 # disabled until we can figure out a way to do it without consistency issues
717 #
718 #return $self->{_resultset}
719 # if ref $self->{_resultset} eq $self->resultset_class;
720 #return $self->{_resultset} =
721
722 return $self->resultset_class->new(
27f01d1f 723 $self, $self->{resultset_attributes}
724 );
5ac6a044 725}
726
701da8c4 727=head2 throw_exception
728
2053ab2a 729See L<DBIx::Class::Schema/"throw_exception">.
701da8c4 730
731=cut
732
733sub throw_exception {
734 my $self = shift;
75d07914 735 if (defined $self->schema) {
701da8c4 736 $self->schema->throw_exception(@_);
737 } else {
738 croak(@_);
739 }
740}
741
9c992ba1 742=head1 AUTHORS
743
744Matt S. Trout <mst@shadowcatsystems.co.uk>
745
746=head1 LICENSE
747
748You may distribute this code under the same terms as Perl itself.
749
750=cut
751