pulling in changes from trunk
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection.pm
CommitLineData
ddccc6a2 1package Reaction::UI::ViewPort::Collection;
2
3use Reaction::Class;
4use Scalar::Util qw/blessed/;
5use aliased 'Reaction::InterfaceModel::Collection' => 'IM_Collection';
6use aliased 'Reaction::UI::ViewPort::Object';
7
8class Collection is 'Reaction::UI::ViewPort', which {
9
10 has members => (is => 'rw', isa => 'ArrayRef', lazy_build => 1);
11
12 has collection => (is => 'ro', isa => IM_Collection, required => 1);
13 has current_collection => (is => 'rw', isa => IM_Collection, lazy_build => 1);
14
15 has member_args => ( is => 'rw', isa => 'HashRef', lazy_build => 1);
16 has member_class => ( is => 'ro', isa => 'Str', lazy_build => 1);
17
18 implements BUILD => as {
19 my ($self, $args) = @_;
c8fbb8ad 20 my $member_args = delete $args->{Member};
ddccc6a2 21 $self->member_args( $member_args ) if ref $member_args;
22 };
23
c8fbb8ad 24 implements _build_member_args => as{ {} };
25
ddccc6a2 26 implements _build_member_class => as{ Object };
27
28 after clear_current_collection => sub{
c8fbb8ad 29 shift->clear_members; #clear the members the current collection changes, duh
ddccc6a2 30 };
31
32 implements _build_current_collection => as {
33 shift->collection;
34 };
35
c8fbb8ad 36 #I'm not really sure why this is here all of a sudden.
37 implements model => as { shift->current_collection };
ddccc6a2 38
39 implements _build_members => as {
40 my ($self) = @_;
41 my (@members, $i);
42 my $args = $self->member_args;
43 my $builders = {};
44 my $ctx = $self->ctx;
45 my $loc = join('-', $self->location, 'member');
46 my $class = $self->member_class;
47
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(
55 ctx => $ctx,
c8fbb8ad 56 model => $obj,
ddccc6a2 57 location => join('-', $loc, $i++),
58 builder_cache => $builder_cache,
59 %$args
60 );
61 push(@members, $member);
62 }
63 return \@members;
64 };
65
66};
67
68
69
701;