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 use MooseX::Types::Moose qw/Str HashRef/;
10 use namespace::clean -except => [ qw(meta) ];
11 extends 'Reaction::UI::ViewPort';
13 has members => (is => 'rw', isa => 'ArrayRef', lazy_build => 1);
15 has collection => (is => 'ro', isa => IM_Collection, required => 1);
16 has current_collection => (is => 'rw', isa => IM_Collection, lazy_build => 1);
18 has member_args => ( is => 'rw', isa => HashRef, lazy_build => 1);
19 has member_class => ( is => 'ro', isa => Str, lazy_build => 1);
22 my ($self, $args) = @_;
23 if( my $member_args = delete $args->{Member} ){
24 $self->member_args( $member_args );
28 sub _build_member_args { {} }
30 sub _build_member_class { Object };
32 after clear_current_collection => sub{
33 shift->clear_members; #clear the members the current collection changes, duh
36 sub _build_current_collection {
37 return $_[0]->collection;
40 #I'm not really sure why this is here all of a sudden.
41 sub model { shift->current_collection }
46 my $args = $self->member_args;
48 my $field_orders = {};
50 my $loc = join('-', $self->location, 'member');
51 my $class = $self->member_class;
53 #replace $i with a real unique identifier so that we don't run a risk of
54 # events being passed down to the wrong viewport. for now i disabled event
55 # passing until i fix this (groditi)
56 for my $obj ( $self->current_collection->members ) {
57 my $type = blessed $obj;
58 my $builder_cache = $builders->{$type} ||= {};
60 if( exists $args->{computed_field_order} ){
61 @order = (computed_field_order => $args->{computed_field_order});
62 } elsif( exists $field_orders->{$type} ) {
63 @order = (computed_field_order => $field_orders->{$type});
66 my $member = $class->new(
69 location => join('-', $loc, $i++),
70 builder_cache => $builder_cache,
74 #cache to prevent the sort function from having to be run potentially
76 $field_orders->{$type} ||= $member->computed_field_order unless @order;
77 push(@members, $member);
82 __PACKAGE__->meta->make_immutable;
91 Reaction::UI::ViewPort::Collection
95 Creates, from an InterfaceModel::Collection, a list of viewports representing
96 each member of the collection.
102 Required read-only L<InterfaceModel::Collection|Reaction::InterfaceModel::Collection>
103 This is the original collection.
105 =head2 current_collection
107 Read-only, lazy-building
108 L<InterfaceModel::Collection|Reaction::InterfaceModel::Collection>
109 This is the collection that will be used to create C<members> and should be
110 altered to reflect any ordering, paging, etc. By default this is the
111 same thing as C<collection>.
115 A read-write HASH ref of additional parameters to pass to the C<member_class>
116 constructor as items are instantiated.
120 The class to use when instantiating items to represent the member items.
122 See: L<Object|Reaction::UI::ViewPort::Object>,
123 L<Member|Reaction::UI::ViewPort::Grid::Member>,
124 L<Member::WithActions|Reaction::UI::ViewPort::Grid::Member::WithActions>,
126 =head1 INTERNAL METHODS
128 These methods, although stable, are subject to change without notice.
129 Extend at your own risk, APIs may change in the future.
133 Intercept a parameter with the key C<Member> amd store it in C<member_args>
137 Returns the C<current_collection>
139 =head2 _build_members
141 Build individual viewports for each member of the collection,
143 =head2 _build_member_args
145 Defaults to an empty HASH ref.
147 =head2 _build_member_class
149 Defaults to L<Reaction::UI::ViewPort::Object>
153 See L<Reaction::Class> for authors.
157 See L<Reaction::Class> for the license.