1 package Reaction::UI::ViewPort::Collection;
4 use Scalar::Util qw/blessed/;
5 use aliased 'Reaction::InterfaceModel::Collection' => 'IM_Collection';
6 use aliased 'Reaction::UI::ViewPort::Object';
8 class Collection is 'Reaction::UI::ViewPort', which {
10 has members => (is => 'rw', isa => 'ArrayRef', lazy_build => 1);
12 has collection => (is => 'ro', isa => IM_Collection, required => 1);
13 has current_collection => (is => 'rw', isa => IM_Collection, lazy_build => 1);
15 has member_args => ( is => 'rw', isa => 'HashRef', lazy_build => 1);
16 has member_class => ( is => 'ro', isa => 'Str', lazy_build => 1);
18 implements BUILD => as {
19 my ($self, $args) = @_;
20 my $member_args = delete $args->{Member};
21 $self->member_args( $member_args ) if ref $member_args;
24 implements _build_member_args => as{ {} };
26 implements _build_member_class => as{ Object };
28 after clear_current_collection => sub{
29 shift->clear_members; #clear the members the current collection changes, duh
32 implements _build_current_collection => as {
36 #I'm not really sure why this is here all of a sudden.
37 implements model => as { shift->current_collection };
39 implements _build_members => as {
42 my $args = $self->member_args;
45 my $loc = join('-', $self->location, 'member');
46 my $class = $self->member_class;
48 #replace $i with a real unique identifier so that we don't run a risk of
49 # events being passed down to the wrong viewport. for now i disabled event
50 # passing until i fix this (groditi)
51 for my $obj ( $self->current_collection->members ) {
52 my $type = blessed $obj;
53 my $builder_cache = $builders->{$type} ||= {};
54 my $member = $class->new(
57 location => join('-', $loc, $i++),
58 builder_cache => $builder_cache,
61 push(@members, $member);