Commit | Line | Data |
7adfd53f |
1 | package Reaction::InterfaceModel::Collection::DBIC::Role::Base; |
2 | |
3 | use Reaction::Role; |
4 | use Scalar::Util qw/blessed/; |
5 | use Class::MOP; |
6 | |
7 | # WARNING - DANGER: this is just an RFC, please DO NOT USE YET |
8 | |
81393881 |
9 | use namespace::clean -except => [ qw(meta) ]; |
10 | |
11 | |
12 | has '_source_resultset' => ( |
13 | is => 'ro', |
14 | required => 1, |
15 | isa => 'DBIx::Class::ResultSet', |
16 | ); |
17 | |
18 | has 'member_type' => ( |
19 | is => 'rw', |
20 | isa => 'ClassName', |
21 | required => 1, |
22 | builder => '_build_member_type', |
23 | clearer => 'clear_member_type', |
24 | predicate => 'has_member_type', |
25 | ); |
26 | |
27 | |
28 | #implements BUILD => as { |
29 | # my $self = shift; |
30 | # Class::MOP::load_class($self->_im_class); |
31 | # confess "_im_result_class must be a Reaction::InterfaceModel::Object" |
32 | # unless $self->_im_class->isa("Reaction::InterfaceModel::Object"); |
33 | # confess "_im_result_class must have an inflate_result method" |
34 | # unless $self->_im_class->can("inflate_result"); |
35 | #}; |
36 | |
37 | |
38 | |
39 | #Oh man. I have a bad feeling about this one. |
40 | sub _build_member_type { |
41 | my $self = shift; |
42 | my $class = blessed($self) || $self; |
43 | $class =~ s/::Collection$//; |
44 | return $class; |
45 | }; |
46 | sub _build__collection_store { |
47 | my $self = shift; |
48 | [ $self->_source_resultset->search({}, {result_class => $self->member_type})->all ]; |
49 | }; |
50 | sub clone { |
51 | my $self = shift; |
52 | my $rs = $self->_source_resultset; #->search_rs({}); |
53 | #should the clone include the arrayref of IM::Objects too? |
54 | return (blessed $self)->new( |
55 | _source_resultset => $rs, |
56 | member_type => $self->member_type, @_ |
57 | ); |
58 | }; |
59 | sub count_members { |
60 | my $self = shift; |
61 | $self->_source_resultset->count; |
62 | }; |
63 | sub add_member { |
64 | confess "Not yet implemented"; |
7adfd53f |
65 | }; |
81393881 |
66 | sub remove_member { |
67 | confess "Not yet implemented"; |
68 | }; |
69 | sub page { |
70 | my $self = shift; |
71 | my $rs = $self->_source_resultset->page(@_); |
72 | return (blessed $self)->new( |
73 | _source_resultset => $rs, |
74 | member_type => $self->member_type, |
75 | ); |
76 | }; |
77 | sub pager { |
78 | my $self = shift; |
79 | return $self->_source_resultset->pager(@_); |
80 | }; |
81 | |
82 | |
7adfd53f |
83 | |
84 | 1; |
85 | |
86 | |
87 | =head1 NAME |
88 | |
89 | Reaction::InterfaceModel::Collection::DBIC::Role::Base |
90 | |
91 | =head1 DESCRIPTION |
92 | |
93 | Provides methods to allow a collection to be populated by a L<DBIx::Class::ResultSet> |
94 | |
95 | =head1 Attributes |
96 | |
97 | =head2 _source_resultset |
98 | |
99 | Required, Read-only. Contains the L<DBIx::Class::ResultSet> used to populate the |
100 | collection. |
101 | |
c8fbb8ad |
102 | =head2 member_type |
7adfd53f |
103 | |
104 | Read-only, lazy_build. The name of the IM Object Class that the resultset inside this |
c8fbb8ad |
105 | collection will inflate to. Predicate: C<has_member_type> |
7adfd53f |
106 | |
107 | =head1 METHODS |
108 | |
109 | =head2 clone |
110 | |
111 | Returns a clone of the current collection, complete with a cloned C<_source_resultset> |
112 | |
113 | =head2 count_members |
114 | |
115 | Returns the number of items found by the ResultSet |
116 | |
117 | =head2 add_member |
118 | |
119 | =head2 remove_member |
120 | |
121 | These will die as they have not been implemented yet. |
122 | |
123 | =head1 PRIVATE METHODS |
124 | |
125 | =head2 _build_im_class |
126 | |
127 | Will attempt to remove the suffix "Collection" from the current class name and return |
128 | that. I.e. C<MyApp::MyIM::Roles::Collection> would return C<MyApp::MyIM::Roles> |
129 | |
130 | =head2 _build_collection_store |
131 | |
132 | Replace the default builder to populate the collection with all results returned by the |
133 | resultset. |
134 | |
135 | =head1 AUTHORS |
136 | |
137 | See L<Reaction::Class> for authors. |
138 | |
139 | =head1 LICENSE |
140 | |
141 | See L<Reaction::Class> for the license. |
142 | |
143 | =cut |