deprecated add_row_info and added replacement method build_metadata
[dbsrgits/DBIx-Class-ResultSet-WithMetaData.git] / lib / DBIx / Class / ResultSet / WithMetaData.pm
index 1cf546b..b1efe90 100644 (file)
@@ -23,13 +23,18 @@ has 'id_cols' => (
   isa => 'ArrayRef',
 );
 
+has '_modifiers' => (
+  is => 'rw',
+  isa => 'ArrayRef',
+);
+
 =head1 VERSION
 
-Version 0.999001
+Version 0.999003
 
 =cut
 
-our $VERSION = '0.999001';
+our $VERSION = '0.999003';
 
 =head1 NAME
 
@@ -44,10 +49,12 @@ DBIx::Class::ResultSet::WithMetaData
   extends 'DBIx::Class::ResultSet::WithMetaData;
 
   method with_substr () {
-    foreach my $row ($self->all) {
-      my $substr = substr($row->name, 0, 3);
-      $self->add_row_info(row => $row, info => { substr => $substr });
-    }
+    $self->build_metadata( modifier => sub () {
+      my $row = shift;
+      my $substr = substr($row->{name}, 0, 3);
+      $row->{substr} = $substr;
+      return $row;
+    });
     return $self;
   }
 
@@ -56,7 +63,7 @@ DBIx::Class::ResultSet::WithMetaData
 
   # then somewhere else
 
-  my $object_type_arrayref = $object_type_rs->limit(count => 3)->with_substr->display();
+  my $object_type_arrayref = $object_type_rs->with_substr->display();
 
   # [{
   #    'artistid' => '1',
@@ -88,7 +95,7 @@ sub new {
   my $self = shift;
 
   my $new = $self->next::method(@_);
-  foreach my $key (qw/_row_info was_row id_cols/) {
+  foreach my $key (qw/_row_info was_row id_cols _modifiers/) {
     alias $new->{$key} = $new->{attrs}{$key};
   }
 
@@ -96,6 +103,10 @@ sub new {
     $new->_row_info({});
   }
 
+  unless ($new->_modifiers) {
+    $new->_modifiers([]);
+  }
+
   unless ($new->id_cols && scalar(@{$new->id_cols})) {
     $new->id_cols([sort $new->result_source->primary_columns]);
   }
@@ -126,96 +137,97 @@ method display () {
   $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
   my @rows;
   foreach my $row ($rs->all) {
+    # THIS BLOCK IS DEPRECATED
     if (my $info = $self->row_info_for(id => $self->_mk_id(row => $row))) {
       $row = { %{$row}, %{$info} };
     }
+
+    foreach my $modifier (@{$rs->_modifiers}) {
+      my $new_row = $modifier->($row);
+      if (ref $new_row ne 'HASH') {
+        die 'modifier subref (added via build_metadata did not return hashref)';
+      }
+      $row = $new_row;
+    }
     push(@rows, $row);
   }
 
   return ($self->was_row) ? $rows[0] : \@rows;
 }
 
-=head2 add_row_info
+=head2 build_metadata
 
 =over 4
 
-=item Arguments: row => DBIx::Class::Row object, info => HashRef to attach to the row
+=item Arguments: modifier => subref($row_hash)
 
 =item Return Value: ResultSet
 
 =back
 
- $rs = $rs->add_row_info(row => $row, info => { dates => [qw/mon weds fri/] } );
+ $self->build_metadata( modifier => sub ($row) { 
+   $row->{dates} = [qw/mon weds fri/];
+   return $row;
+ });
 
-This method allows you to attach a HashRef of metadata to a row which will be merged
-with that row when the ResultSet is flattened to a datastructure with L</display>.
+This method allows you to alter the hash to add additional metadata to it
+at L</display> time.
 
 =cut
 
-method add_row_info (%opts) {
-  my ($row, $id, $info) = map { $opts{$_} } qw/row id info/;
-  if ($row) {
-    $id = $self->_mk_id(row => { $row->get_columns });
-  }
-  unless ($self->find($id)) {
-    die 'invalid id passed to add_row_info';
-  }
-
-  if (my $existing = $self->_row_info->{$id}) {
-    $info = { %{$existing}, %{$info} };
+method build_metadata (%opts) {
+  my ($modifier) = map { $opts{$_} } qw/modifier/;
+  unless ($modifier && (ref $modifier eq 'CODE')) {
+    die 'build_metadata called without modifier param';
   }
 
-  $self->_row_info->{$id} = $info;  
+  push( @{$self->_modifiers}, $modifier );
 }
 
-method row_info_for (%opts) {
-  my $id = $opts{id};
-  return $self->_row_info->{$id};
-}
 
-=head2 order_by (EXPERIMENTAL)
+=head2 add_row_info (DEPRECATED)
 
 =over 4
 
-=item Arguments: col => $column_name
+=item Arguments: row => DBIx::Class::Row object, info => HashRef to attach to the row
 
 =item Return Value: ResultSet
 
 =back
 
- $ordered_rs = $rs->order_by(col => 'name');
+ $rs = $rs->add_row_info(row => $row, info => { dates => [qw/mon weds fri/] } );
 
-Convenience method. Essentually a shortcut for $rs->search({}, { order_by => $col }).
+DEPRECATED - this method is quite slow as it requires that you iterate through 
+the resultset each time you want to add metadata. Replaced by L</build_metadata>.
 
 =cut
 
-method order_by (%opts) {
-  my $col = $opts{col};
-  $col = "me.$col" unless ($col =~ m/\./);
-  return $self->search({}, { order_by => $col });
-}
-
-=head2 limit (EXPERIMENTAL)
-
-=over 4
-
-=item Arguments: count => Int
-
-=item Return Value: ResultSet
+method add_row_info (%opts) {
+  my ($row, $id, $info) = map { $opts{$_} } qw/row id info/;
 
-=back
+  warn 'DEPRECATED - add_row_info is deprecated in favour of build_metadata';
+  if ($row) {
+    $id = $self->_mk_id(row => { $row->get_columns });
+  }
 
- $limitted_rs = $rs->limit(count => 3);
+  unless ($row || $self->find($id)) {
+    die 'invalid id passed to add_row_info';
+  }
 
-Convenience method. Essentually a shortcut for $rs->search({}, { rows => $count }).
+  if (my $existing = $self->_row_info->{$id}) {
+    $info = { %{$existing}, %{$info} };
+  }
 
-=cut
+  $self->_row_info->{$id} = $info;  
+}
 
-method limit (%opts) {
-  my $count = $opts{count};
-  return $self->search({}, { rows => $count });
+# DEPRECATED
+method row_info_for (%opts) {
+  my $id = $opts{id};
+  return $self->_row_info->{$id};
 }
 
+# DEPRECATED
 method _mk_id (%opts) {
   my $row = $opts{row};
   return join('-', map { $row->{$_} } @{$self->id_cols});