Commit | Line | Data |
db57afbb |
1 | package DBIx::Class::ResultSetManager; |
ed28f830 |
2 | use strict; |
3 | use base 'DBIx::Class'; |
4 | use Class::Inspector; |
5 | |
570783b1 |
6 | __PACKAGE__->mk_classdata($_) for qw/ _attr_cache base_resultset_class custom_resultset_class_suffix /; |
ed28f830 |
7 | __PACKAGE__->_attr_cache({}); |
570783b1 |
8 | __PACKAGE__->base_resultset_class('DBIx::Class::ResultSet'); |
9 | __PACKAGE__->custom_resultset_class_suffix('::_resultset'); |
ed28f830 |
10 | |
11 | sub table { |
12 | my ($self,@rest) = @_; |
13 | $self->next::method(@rest); |
14 | $self->_register_attributes; |
570783b1 |
15 | $self->_register_resultset_class; |
ed28f830 |
16 | } |
17 | |
18 | sub load_resultset_components { |
19 | my ($self,@comp) = @_; |
20 | my $resultset_class = $self->_setup_resultset_class; |
21 | $resultset_class->load_components(@comp); |
22 | } |
23 | |
24 | sub MODIFY_CODE_ATTRIBUTES { |
25 | my ($class,$code,@attrs) = @_; |
26 | $class->_attr_cache({ %{$class->_attr_cache}, $code => [@attrs] }); |
27 | return (); |
28 | } |
29 | |
30 | sub _register_attributes { |
31 | my $self = shift; |
32 | my $cache = $self->_attr_cache; |
33 | foreach my $meth (@{Class::Inspector->methods($self) || []}) { |
34 | my $attrs = $cache->{$self->can($meth)}; |
35 | next unless $attrs; |
36 | if ($attrs->[0] eq 'resultset') { |
37 | no strict 'refs'; |
38 | my $resultset_class = $self->_setup_resultset_class; |
39 | *{"$resultset_class\::$meth"} = *{"$self\::$meth"}; |
40 | undef *{"$self\::$meth"}; |
41 | } |
42 | } |
43 | $self->_attr_cache(undef); |
44 | } |
45 | |
46 | sub _setup_resultset_class { |
47 | my $self = shift; |
48 | my $resultset_class = $self . $self->custom_resultset_class_suffix; |
49 | no strict 'refs'; |
50 | unless (@{"$resultset_class\::ISA"}) { |
570783b1 |
51 | @{"$resultset_class\::ISA"} = ($self->base_resultset_class); |
ed28f830 |
52 | } |
53 | return $resultset_class; |
54 | } |
55 | |
570783b1 |
56 | sub _register_resultset_class { |
57 | my $self = shift; |
58 | my $resultset_class = $self . $self->custom_resultset_class_suffix; |
59 | no strict 'refs'; |
60 | if (@{"$resultset_class\::ISA"}) { |
61 | $self->result_source_instance->resultset_class($resultset_class); |
62 | } else { |
63 | $self->result_source_instance->resultset_class($self->base_resultset_class); |
64 | } |
65 | } |
66 | |
ed28f830 |
67 | 1; |