Start setting the 'c3' mro unambiguously everywhere
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSourceProxy.pm
1 package # hide from PAUSE
2     DBIx::Class::ResultSourceProxy;
3
4 use strict;
5 use warnings;
6
7 use base 'DBIx::Class';
8 use mro 'c3';
9
10 use Scalar::Util 'blessed';
11 use DBIx::Class::_Util 'quote_sub';
12 use namespace::clean;
13
14 __PACKAGE__->mk_group_accessors('inherited_ro_instance' => 'source_name');
15
16 sub get_inherited_ro_instance {  shift->get_inherited(@_) }
17
18 sub set_inherited_ro_instance {
19   my $self = shift;
20
21   $self->throw_exception ("Cannot set @{[shift]} on an instance")
22     if blessed $self;
23
24   $self->set_inherited(@_);
25 }
26
27
28 sub add_columns {
29   my ($class, @cols) = @_;
30   my $source = $class->result_source_instance;
31   $source->add_columns(@cols);
32   foreach my $c (grep { !ref } @cols) {
33     # If this is an augment definition get the real colname.
34     $c =~ s/^\+//;
35
36     $class->register_column($c => $source->column_info($c));
37   }
38 }
39
40 sub add_column { shift->add_columns(@_) }
41
42
43 sub add_relationship {
44   my ($class, $rel, @rest) = @_;
45   my $source = $class->result_source_instance;
46   $source->add_relationship($rel => @rest);
47   $class->register_relationship($rel => $source->relationship_info($rel));
48 }
49
50
51 # legacy resultset_class accessor, seems to be used by cdbi only
52 sub iterator_class { shift->result_source_instance->resultset_class(@_) }
53
54 for my $method_to_proxy (qw/
55   source_info
56   result_class
57   resultset_class
58   resultset_attributes
59
60   columns
61   has_column
62
63   remove_column
64   remove_columns
65
66   column_info
67   columns_info
68   column_info_from_storage
69
70   set_primary_key
71   primary_columns
72   sequence
73
74   add_unique_constraint
75   add_unique_constraints
76
77   unique_constraints
78   unique_constraint_names
79   unique_constraint_columns
80
81   relationships
82   relationship_info
83   has_relationship
84 /) {
85   quote_sub __PACKAGE__."::$method_to_proxy", sprintf( <<'EOC', $method_to_proxy );
86     DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and DBIx::Class::_Util::fail_on_internal_call;
87     shift->result_source_instance->%s (@_);
88 EOC
89
90 }
91
92 1;