{
package Record;
use Moose;
-
+
has 'first_name' => (is => 'ro', isa => 'Str');
- has 'last_name' => (is => 'ro', isa => 'Str');
-
+ has 'last_name' => (is => 'ro', isa => 'Str');
+
package RecordSet;
use Moose;
-
+
has 'data' => (
is => 'ro',
- isa => 'ArrayRef[Record]',
+ isa => 'ArrayRef[Record]',
default => sub { [] },
);
-
+
has 'index' => (
is => 'rw',
- isa => 'Int',
+ isa => 'Int',
default => sub { 0 },
);
-
+
sub next {
my $self = shift;
my $i = $self->index;
$self->index($i + 1);
return $self->data->[$i];
}
-
+
package RecordSetIterator;
use Moose;
isa => 'RecordSet',
);
- # list the fields you want to
+ # list the fields you want to
# fetch from the current record
my @fields = Record->meta->get_attribute_list;
has 'current_record' => (
is => 'rw',
- isa => 'Record',
+ isa => 'Record',
lazy => 1,
default => sub {
my $self = shift;
},
trigger => sub {
my $self = shift;
- # whenever this attribute is
- # updated, it will clear all
+ # whenever this attribute is
+ # updated, it will clear all
# the fields for you.
$self->$_() for map { '_clear_' . $_ } @fields;
}
);
- # define the attributes
+ # define the attributes
# for all the fields.
for my $field (@fields) {
has $field => (
is => 'ro',
- isa => 'Any',
+ isa => 'Any',
lazy => 1,
- default => sub {
+ default => sub {
my $self = shift;
- # fetch the value from
+ # fetch the value from
# the current record
$self->current_record->$field();
},
my $rs = RecordSet->new(
data => [
Record->new(first_name => 'Bill', last_name => 'Smith'),
- Record->new(first_name => 'Bob', last_name => 'Jones'),
- Record->new(first_name => 'Jim', last_name => 'Johnson'),
+ Record->new(first_name => 'Bob', last_name => 'Jones'),
+ Record->new(first_name => 'Jim', last_name => 'Johnson'),
]
);
isa_ok($rs, 'RecordSet');