Commit | Line | Data |
114916fc |
1 | package Reaction::UI::ViewPort::Action::Role::Close; |
2 | |
3 | use Reaction::Role; |
4 | use MooseX::Types::Moose qw/Str CodeRef/; |
5 | with 'Reaction::UI::ViewPort::Action::Role::Apply'; |
6 | |
7 | has close_label => (is => 'rw', isa => Str, lazy_build => 1); |
8 | has on_close_callback => (is => 'rw', isa => CodeRef); |
9 | has close_label_close => (is => 'rw', isa => Str, lazy_build => 1); |
10 | has close_label_cancel => (is => 'rw', isa => Str, lazy_build => 1); |
11 | |
12 | sub _build_close_label { shift->_build_close_label_close } |
13 | sub _build_close_label_close { 'close' } |
14 | sub _build_close_label_cancel { 'cancel' } |
15 | |
16 | sub can_close { 1 } |
17 | |
18 | sub close { |
19 | my $self = shift; |
20 | return unless $self->has_on_close_callback; |
21 | $self->on_close_callback->($self); |
22 | } |
23 | |
24 | around apply => sub { |
25 | my $orig = shift; |
26 | my $self = shift; |
27 | my $success = $self->$orig(@_); |
28 | $self->close_label( $self->close_label_cancel ) unless $success; |
29 | return $success; |
30 | }; |
31 | |
32 | # can't do a close-type operation if there's nowhere to go afterwards |
33 | around accept_events => sub { |
34 | my $orig = shift; |
35 | my $self = shift; |
36 | ( ($self->has_on_close_callback ? ('close') : ()), $self->$orig(@_) ); |
37 | }; |
38 | |
39 | 1; |
7826ddac |
40 | |
41 | __END__ |
42 | |
43 | =head1 NAME |
44 | |
63bb30b4 |
45 | Reaction::UI::ViewPort::Action::Role::Close - Integrate Close and Apply events into ViewPort |
46 | |
47 | =head1 SYNOPSIS |
48 | |
49 | package MyApp::UI::ViewPort::SomeAction; |
50 | use Reaction::Class; |
51 | |
52 | use namespace::clean -except => 'meta'; |
53 | |
54 | extends 'Reaction::UI::ViewPort::Object::Mutable'; |
55 | with 'Reaction::UI::ViewPort::Action::Role::Close'; |
56 | |
57 | ... |
58 | 1; |
59 | |
60 | =head1 DESCRIPTION |
61 | |
62 | This role integrates a C<close> event and inherits an |
63 | L<apply|Reaction::UI::ViewPort::Action::Role::Close/apply> |
64 | event into the consuming viewport. |
7826ddac |
65 | |
66 | =head1 ATTRIBUTES |
67 | |
68 | =head2 close_label |
69 | |
63bb30b4 |
70 | Defaults to returned string value of L</_build_close_label> (C<close>). |
7826ddac |
71 | |
72 | =head2 close_label_close |
73 | |
63bb30b4 |
74 | Defaults to returned string value of L</_build_close_label_close> (C<close>). |
7826ddac |
75 | |
76 | =head2 close_label_cancel |
77 | |
63bb30b4 |
78 | This label is only shown when C<changed> is true. It is initialised |
79 | with the returned string value of L</_build_close_label_cancel>. |
7826ddac |
80 | |
81 | Default: 'cancel' |
82 | |
83 | =head2 on_close_callback |
84 | |
63bb30b4 |
85 | CodeRef. If set will be called on L</close>. |
7826ddac |
86 | |
87 | =head1 METHODS |
88 | |
89 | =head2 close |
90 | |
63bb30b4 |
91 | Calls L</on_close_callback> if one is set. |
92 | |
7826ddac |
93 | =head2 can_close |
94 | |
63bb30b4 |
95 | Returns true. |
96 | |
97 | =head2 apply |
98 | |
99 | Extends L<Reaction::UI::ViewPort::Action::Role::Apply/apply> and sets |
100 | the L</close_label> to L</close_label_cancel> if the original call to |
101 | C<apply> was not successfull. |
102 | |
103 | Returns the result of the original C<apply> call. |
104 | |
105 | =head2 accept_events |
106 | |
107 | Extends L<Reaction::UI::ViewPort::Action::Role::Apply/accept_events> |
108 | with the C<close> event if an L</on_close_callback> was provided. |
109 | |
7826ddac |
110 | =head1 SEE ALSO |
111 | |
112 | L<Reaction::UI::ViewPort::Action::Role::Apply> |
113 | |
114 | L<Reaction::UI::ViewPort::Action::Role::OK> |
115 | |
116 | =head1 AUTHORS |
117 | |
118 | See L<Reaction::Class> for authors. |
119 | |
120 | =head1 LICENSE |
121 | |
122 | See L<Reaction::Class> for the license. |
123 | |
124 | =cut |