Annotate every indirect sugar-method
[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
9 # needs to be loaded early to query method attributes below
10 use DBIx::Class::ResultSource;
11
12 use DBIx::Class::_Util qw( quote_sub fail_on_internal_call );
13 use namespace::clean;
14
15 __PACKAGE__->mk_group_accessors('inherited_ro_instance' => 'source_name');
16
17 sub get_inherited_ro_instance { $_[0]->get_inherited($_[1]) }
18
19 sub set_inherited_ro_instance {
20   $_[0]->throw_exception ("Cannot set '$_[1]' on an instance")
21     if length ref $_[0];
22
23   $_[0]->set_inherited( $_[1], $_[2] );
24 }
25
26
27 sub add_columns {
28   my ($class, @cols) = @_;
29   my $source = $class->result_source;
30   $source->add_columns(@cols);
31
32   my $colinfos;
33   foreach my $c (grep { !ref } @cols) {
34     # If this is an augment definition get the real colname.
35     $c =~ s/^\+//;
36
37     $class->register_column(
38       $c,
39       ( $colinfos ||= $source->columns_info )->{$c}
40     );
41   }
42 }
43
44 sub add_column :DBIC_method_is_indirect_sugar {
45   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
46   shift->add_columns(@_)
47 }
48
49
50 sub add_relationship {
51   my ($class, $rel, @rest) = @_;
52   my $source = $class->result_source;
53   $source->add_relationship($rel => @rest);
54   $class->register_relationship($rel => $source->relationship_info($rel));
55 }
56
57
58 # legacy resultset_class accessor, seems to be used by cdbi only
59 sub iterator_class :DBIC_method_is_indirect_sugar {
60   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
61   shift->result_source->resultset_class(@_)
62 }
63
64 for my $method_to_proxy (qw/
65   source_info
66   result_class
67   resultset_class
68   resultset_attributes
69
70   columns
71   has_column
72
73   remove_column
74   remove_columns
75
76   column_info
77   columns_info
78   column_info_from_storage
79
80   set_primary_key
81   primary_columns
82   sequence
83
84   add_unique_constraint
85   add_unique_constraints
86
87   unique_constraints
88   unique_constraint_names
89   unique_constraint_columns
90
91   relationships
92   relationship_info
93   has_relationship
94 /) {
95
96   my $qsub_opts = { attributes => [ do {
97     no strict 'refs';
98     attributes::get( \&{"DBIx::Class::ResultSource::$method_to_proxy"} )
99   } ] };
100
101   quote_sub __PACKAGE__."::$method_to_proxy", sprintf( <<'EOC', $method_to_proxy ), {}, $qsub_opts;
102     DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and DBIx::Class::_Util::fail_on_internal_call;
103
104     shift->result_source->%s (@_);
105 EOC
106
107 }
108
109 1;