Commit | Line | Data |
ddccc6a2 |
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) = @_; |
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 | |
70 | 1; |