1 package DBIx::Class::ResultSet::WithMetaData;
8 use MooseX::Method::Signatures;
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 (Int :$id, :$row, HashRef :$info) {
157 $id = $self->_mk_id(row => { $row->get_columns });
159 unless ($self->find($id)) {
160 die 'invalid id passed to add_row_info';
163 if (my $existing = $self->_row_info->{$id}) {
164 $info = { %{$existing}, %{$info} };
167 $self->_row_info->{$id} = $info;
170 method row_info_for (Int :$id) {
171 return $self->_row_info->{$id};
174 =head2 order_by (EXPERIMENTAL)
178 =item Arguments: col => $column_name
180 =item Return Value: ResultSet
184 $ordered_rs = $rs->order_by(col => 'name');
186 Convenience method. Essentually a shortcut for $rs->search({}, { order_by => $col }).
190 method order_by (Str :$col) {
191 $col = "me.$col" unless ($col =~ m/\./);
192 return $self->search({}, { order_by => $col });
195 =head2 limit (EXPERIMENTAL)
199 =item Arguments: count => Int
201 =item Return Value: ResultSet
205 $limitted_rs = $rs->limit(count => 3);
207 Convenience method. Essentually a shortcut for $rs->search({}, { rows => $count }).
211 method limit (Int :$count) {
212 return $self->search({}, { rows => $count });
215 method _mk_id (HashRef :$row) {
216 return join('-', map { $row->{$_} } @{$self->id_cols});
221 Luke Saunders <luke.saunders@gmail.com>
225 As usual, thanks to Matt S Trout for the sanity check.
229 This library is free software under the same license as perl itself