epic-s6ts
[kivitendo-erp.git] / SL / Controller / Helper / GetModels / Base.pm
1 package SL::Controller::Helper::GetModels::Base;
2
3 use strict;
4 use parent 'Rose::Object';
5 use Scalar::Util qw(weaken);
6
7 use Rose::Object::MakeMethods::Generic (
8   scalar => [ qw(get_models disabled finalized) ],
9 );
10
11 # phase stubs
12 sub read_params { die 'implement me' }
13
14 sub finalize { die 'implement me' }
15
16 sub set_get_models {
17   $_[0]->get_models($_[1]);
18
19   weaken($_[1]);
20 }
21
22 sub merge_args {
23   my ($self, @args) = @_;
24   my $final_args = { };
25
26   for my $field (qw(query with_objects)) {
27     $final_args->{$field} = [ map { @{ $_->{$field} || [] } } @args ];
28   }
29
30   for my $field (qw(page per_page sort_by)) {
31     for my $arg (@args) {
32       next unless defined $arg->{$field};
33       $final_args->{$field} //= $arg->{$field};
34     }
35   }
36
37   return %$final_args;
38 }
39
40 sub is_enabled {
41   my ($self) = @_;
42   return !$self->disabled;
43 }
44
45 1;
46
47 __END__
48
49 =encoding utf-8
50
51 =head1 NAME
52
53 SL::Controller::Helper::GetModels::Base - base class for GetModels plugins
54
55 =head1 SYNOPSIS
56
57   package SL::Controller::Helper::Getmodels::...;
58   use parent 'SL::Controller::Helper::Getmodels::Base'
59
60   sub read_params { ... }
61
62   sub finalize { ... }
63
64 =head1 DESCRIPTION
65
66 This is a base class for plugins of the GetModels framework for controllers. It
67 provides some common ground.
68
69 =head1 FUNCTIONS
70
71 =over 4
72
73 =item read_params
74
75 This will be called when GetModels transitions to C<Init> phase.
76 Make sure that you don't need anything from source after that.
77
78 =item finalize
79
80 This will be called when GetModels transitions to C<finalized> phase. Make sure
81 that no internal state or configuration gets changed after this.
82
83 =item merge_args
84
85 Common function to merge the output of various callbacks.
86
87 =back
88
89 =head1 BUGS AND CAVEATS
90
91 None yet :)
92
93 =head1 AUTHOR
94
95 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
96
97 =cut
98