31cdcb0e817304f58217231e2d727436c635fac6
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / AccessorGroup.pm
1 package DBIx::Class::AccessorGroup;
2
3 use strict;
4 use warnings;
5
6 use base qw( DBIx::Class::MethodAttributes Class::Accessor::Grouped );
7
8 use Scalar::Util 'blessed';
9 use DBIx::Class::_Util 'fail_on_internal_call';
10 use namespace::clean;
11
12 sub mk_classdata :DBIC_method_is_indirect_sugar {
13   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
14   shift->mk_classaccessor(@_);
15 }
16
17 sub mk_classaccessor :DBIC_method_is_indirect_sugar {
18   my $self = shift;
19   $self->mk_group_accessors('inherited', $_[0]);
20   (@_ > 1)
21     ? $self->set_inherited(@_)
22     : ( DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call )
23   ;
24 }
25
26 sub mk_group_accessors {
27   my $class = shift;
28   my $type = shift;
29
30   $class->next::method($type, @_);
31
32   # label things
33   if( $type =~ /^ ( inflated_ | filtered_ )? column $/x ) {
34
35     $class = ref $class
36       if length ref $class;
37
38     for my $acc_pair  (
39       map
40         { [ $_, "_${_}_accessor" ] }
41         map
42           { ref $_ ? $_->[0] : $_ }
43           @_
44     ) {
45
46       for my $i (0, 1) {
47
48         my $acc_name = $acc_pair->[$i];
49
50         attributes->import(
51           $class,
52           (
53             $class->can($acc_name)
54               ||
55             Carp::confess("Accessor '$acc_name' we just created on $class can't be found...?")
56           ),
57           'DBIC_method_is_generated_from_resultsource_metadata',
58           ($i
59             ? "DBIC_method_is_${type}_extra_accessor"
60             : "DBIC_method_is_${type}_accessor"
61           ),
62         )
63       }
64     }
65   }
66   elsif( $type eq 'inherited_ro_instance' ) {
67     DBIx::Class::Exception->throw(
68       "The 'inherted_ro_instance' CAG group has been retired - use 'inherited' instead"
69     );
70   }
71 }
72
73 sub get_component_class {
74   my $class = $_[0]->get_inherited($_[1]);
75
76   no strict 'refs';
77   if (
78     defined $class
79       and
80     # inherited CAG can't be set to undef effectively, so people may use ''
81     length $class
82       and
83     # It's already an object, just go for it.
84     ! defined blessed $class
85       and
86     ! ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
87   ) {
88     $_[0]->ensure_class_loaded($class);
89
90     ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
91       = do { \(my $anon = 'loaded') };
92   }
93
94   $class;
95 };
96
97 sub set_component_class {
98   $_[0]->set_inherited($_[1], $_[2]);
99
100   # trigger a load for the case of $foo->component_accessor("bar")->new
101   $_[0]->get_component_class($_[1])
102     if defined wantarray;
103 }
104
105 1;
106
107 =head1 NAME
108
109 DBIx::Class::AccessorGroup - See Class::Accessor::Grouped
110
111 =head1 SYNOPSIS
112
113 =head1 DESCRIPTION
114
115 This class now exists in its own right on CPAN as Class::Accessor::Grouped
116
117 =head1 FURTHER QUESTIONS?
118
119 Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
120
121 =head1 COPYRIGHT AND LICENSE
122
123 This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
124 by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
125 redistribute it and/or modify it under the same terms as the
126 L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
127
128 =cut