search spec components factored out of T365
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection / Role / UseSearchSpec.pm
1 package Reaction::UI::ViewPort::Collection::Role::UseSearchSpec;
2
3 use Reaction::Role;
4 use aliased 'Reaction::InterfaceModel::Search::Spec' => 'SearchSpecRole';
5 use Scalar::Util qw(weaken);
6 use Method::Signatures::Simple;
7 use signatures;
8 use namespace::clean -except => 'meta';
9
10 has 'search_spec' => (isa => SearchSpecRole, is => 'ro', required => 1);
11
12 has '_search_spec_cb' => (is => 'ro', lazy_build => 1);
13
14 method _build__search_spec_cb () {
15   my $object = $self;
16   weaken($object);
17   my $cb = sub { $object->clear_current_collection };
18 }
19
20 method _filter_collection_using_search_spec($coll) {
21   $self->search_spec->filter_collection($coll);
22 }
23
24 method _register_self_with_search_spec () {
25   my $cb = $self->_search_spec_cb;
26   $self->search_spec->register_dependent($self, $cb);
27 }
28
29 around _build_current_collection => sub ($orig, $self, @rest) {
30   my $coll = $self->$orig(@rest);
31   return $self->_filter_collection_using_search_spec($coll);
32 };
33
34 1;
35