b9acae96b4a103d9e6c265d421504dd01a5df874
[catagits/Reaction.git] / lib / Reaction / InterfaceModel / Collection / DBIC / Role / Base.pm
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
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";
65 };
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
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
102 =head2 member_type
103
104 Read-only, lazy_build. The name of the IM Object Class that the resultset inside this
105 collection will inflate to. Predicate: C<has_member_type>
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