c76a4564d298884846e14e3de99b8377e1a13ea7
[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 use mro 'c3';
8
9 use Scalar::Util 'blessed';
10 use DBIx::Class::_Util 'fail_on_internal_call';
11 use namespace::clean;
12
13 sub mk_classdata {
14   DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call;
15   shift->mk_classaccessor(@_);
16 }
17
18 sub mk_classaccessor {
19   my $self = shift;
20   $self->mk_group_accessors('inherited', $_[0]);
21   (@_ > 1)
22     ? $self->set_inherited(@_)
23     : ( DBIx::Class::_ENV_::ASSERT_NO_INTERNAL_INDIRECT_CALLS and fail_on_internal_call )
24   ;
25 }
26
27 sub get_component_class {
28   my $class = $_[0]->get_inherited($_[1]);
29
30   no strict 'refs';
31   if (
32     defined $class
33       and
34     # inherited CAG can't be set to undef effectively, so people may use ''
35     length $class
36       and
37     # It's already an object, just go for it.
38     ! defined blessed $class
39       and
40     ! ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
41   ) {
42     $_[0]->ensure_class_loaded($class);
43
44     mro::set_mro( $class, 'c3' );
45
46     ${"${class}::__LOADED__BY__DBIC__CAG__COMPONENT_CLASS__"}
47       = do { \(my $anon = 'loaded') };
48   }
49
50   $class;
51 };
52
53 sub set_component_class {
54   $_[0]->set_inherited($_[1], $_[2]);
55
56   # trigger a load for the case of $foo->component_accessor("bar")->new
57   $_[0]->get_component_class($_[1])
58     if defined wantarray;
59 }
60
61 1;
62
63 =head1 NAME
64
65 DBIx::Class::AccessorGroup - See Class::Accessor::Grouped
66
67 =head1 SYNOPSIS
68
69 =head1 DESCRIPTION
70
71 This class now exists in its own right on CPAN as Class::Accessor::Grouped
72
73 =head1 FURTHER QUESTIONS?
74
75 Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
76
77 =head1 COPYRIGHT AND LICENSE
78
79 This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
80 by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
81 redistribute it and/or modify it under the same terms as the
82 L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
83
84 =cut