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