1 package DBIx::Class::ResultSet::WithMetaData;
8 use Method::Signatures::Simple;
9 extends 'DBIx::Class::ResultSet';
32 our $VERSION = '0.999001';
36 DBIx::Class::ResultSet::WithMetaData
40 package MyApp::Schema::ResultSet::ObjectType;
43 use MooseX::Method::Signatures;
44 extends 'DBIx::Class::ResultSet::WithMetaData;
46 method with_substr () {
47 foreach my $row ($self->all) {
48 my $substr = substr($row->name, 0, 3);
49 $self->add_row_info(row => $row, info => { substr => $substr });
59 my $object_type_arrayref = $object_type_rs->limit(count => 3)->with_substr->display();
63 # 'name' => 'Caterwauler McCrae',
68 # 'name' => 'Random Boy Band',
73 # 'name' => 'We Are Goth',
79 Attach metadata to rows by chaining ResultSet methods together. When the ResultSet is
80 flattened to an ArrayRef the attached metadata is merged with the row hashes to give
81 a combined 'hash-plus-other-stuff' representation.
90 my $new = $self->next::method(@_);
91 foreach my $key (qw/_row_info was_row id_cols/) {
92 alias $new->{$key} = $new->{attrs}{$key};
95 unless ($new->_row_info) {
99 unless ($new->id_cols && scalar(@{$new->id_cols})) {
100 $new->id_cols([sort $new->result_source->primary_columns]);
110 =item Arguments: none
112 =item Return Value: ArrayRef
116 $arrayref_of_row_hashrefs = $rs->display();
118 This method uses L<DBIx::Class::ResultClass::HashRefInflator> to convert all
119 rows in the ResultSet to HashRefs. These are then merged with any metadata
120 that had been attached to the rows using L</add_row_info>.
125 my $rs = $self->search({});
126 $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
128 foreach my $row ($rs->all) {
129 if (my $info = $self->row_info_for(id => $self->_mk_id(row => $row))) {
130 $row = { %{$row}, %{$info} };
135 return ($self->was_row) ? $rows[0] : \@rows;
142 =item Arguments: row => DBIx::Class::Row object, info => HashRef to attach to the row
144 =item Return Value: ResultSet
148 $rs = $rs->add_row_info(row => $row, info => { dates => [qw/mon weds fri/] } );
150 This method allows you to attach a HashRef of metadata to a row which will be merged
151 with that row when the ResultSet is flattened to a datastructure with L</display>.
155 method add_row_info (%opts) {
156 my ($row, $id, $info) = map { $opts{$_} } qw/row id info/;
158 $id = $self->_mk_id(row => { $row->get_columns });
160 unless ($self->find($id)) {
161 die 'invalid id passed to add_row_info';
164 if (my $existing = $self->_row_info->{$id}) {
165 $info = { %{$existing}, %{$info} };
168 $self->_row_info->{$id} = $info;
171 method row_info_for (%opts) {
173 return $self->_row_info->{$id};
176 =head2 order_by (EXPERIMENTAL)
180 =item Arguments: col => $column_name
182 =item Return Value: ResultSet
186 $ordered_rs = $rs->order_by(col => 'name');
188 Convenience method. Essentually a shortcut for $rs->search({}, { order_by => $col }).
192 method order_by (%opts) {
193 my $col = $opts{col};
194 $col = "me.$col" unless ($col =~ m/\./);
195 return $self->search({}, { order_by => $col });
198 =head2 limit (EXPERIMENTAL)
202 =item Arguments: count => Int
204 =item Return Value: ResultSet
208 $limitted_rs = $rs->limit(count => 3);
210 Convenience method. Essentually a shortcut for $rs->search({}, { rows => $count }).
214 method limit (%opts) {
215 my $count = $opts{count};
216 return $self->search({}, { rows => $count });
219 method _mk_id (%opts) {
220 my $row = $opts{row};
221 return join('-', map { $row->{$_} } @{$self->id_cols});
226 Luke Saunders <luke.saunders@gmail.com>
230 As usual, thanks to Matt S Trout for the sanity check.
234 This library is free software under the same license as perl itself