package DBIx::Class::Helper::Functional;
use strict;
use warnings;
use Carp qw(croak);

=head1 NAME

DBIx::Class::Helper::Functional

=head1 SYNOPSIS

  package MyApp::Schema::ResultSet::FooBar;
  __PACKAGE__->load_components('Helper::Functional');
  1;

Then in your main code:

  my $rs = $schema->resultset('FooBar')->search(....);
  $rs->foreach(sub { print $_[0]->firstname });
  my @ids = $rs->map(sub { shift->id });
  my @losers = $rs->filter(sub { shift->firstname eq 'Toby' });

=head1 METHODS

=cut

=head2 foreach

Calls the passed code-reference upon every result in the resultset.

=cut

sub foreach {
    my ($self, $sub) = @_;
    croak("foreach() requires a code reference")
        unless (ref($sub) eq 'CODE');

    $self->reset;

    while (my $result = $self->next) {
        $sub->($result);
    }
}

=head2 map

Calls the passed code-reference upon every result in the resultset, and returns
the results as a new array.

=cut

sub map {
    my ($self, $sub) = @_;
    croak("map() requires a code reference")
        unless (ref($sub) eq 'CODE');

    $self->reset;

    my @results;   
    while (my $result = $self->next) {
        push @results, $sub->($result);
    }
    return @results;
}

=head2 filter

Calls the passed code-reference upon every result in the resultset, and only
returns the results where the code returned true.

=cut

sub filter {
    my ($self, $sub) = @_;
    croak("filter() requires a code reference")
        unless (ref($sub) eq 'CODE');

    $self->reset;

    my @results;
    while (my $result = $self->next) {
        push(@results, $result) if $sub->($result);
    }
    return @results;
}

=head1 AUTHOR

Toby Corkindale, tjc@cpan.org.

=cut

1;
