work in progress, listview still broken
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection.pm
1 package Reaction::UI::ViewPort::Collection;
2
3 use Reaction::Class;
4 use Scalar::Util qw/blessed/;
5 use aliased 'Reaction::InterfaceModel::Collection' => 'IM_Collection';
6 use aliased 'Reaction::UI::ViewPort::Object';
7
8 class 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) = @_;
20     my $member_args = delete $args->{Member};
21     $self->member_args( $member_args ) if ref $member_args;
22   };
23
24   implements _build_member_args => as{ {} };
25
26   implements _build_member_class => as{ Object };
27
28   after clear_current_collection => sub{
29     shift->clear_members; #clear the members the current collection changes, duh
30   };
31
32   implements _build_current_collection => as {
33     shift->collection;
34   };
35
36   #I'm not really sure why this is here all of a sudden.
37   implements model => as { shift->current_collection };
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,
56                             model         => $obj,
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
70 1;