1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
package Reaction::UI::ViewPort::Role::Actions;
use Reaction::Role;
use Reaction::UI::ViewPort::URI;
use namespace::clean -except => [ qw(meta) ];
has actions => (
is => 'ro',
isa => 'ArrayRef',
lazy_build => 1
);
has action_order => (
is => 'ro',
isa => 'ArrayRef'
);
has action_prototypes => (
is => 'ro',
isa => 'HashRef',
required => 1,
default => sub{ {} }
);
has computed_action_order => (
is => 'ro',
isa => 'ArrayRef',
lazy_build => 1
);
sub _build_computed_action_order {
my $self = shift;
my $ordered = $self->sort_by_spec(
($self->has_action_order ? $self->action_order : []),
[ keys %{ $self->action_prototypes } ]
);
return $ordered ;
}
sub _build_actions {
my ($self) = @_;
my (@act, $i);
my $ctx = $self->ctx;
my $loc = $self->location;
my $target = $self->model;
foreach my $proto_name ( @{ $self->computed_action_order } ) {
my $proto = $self->action_prototypes->{$proto_name};
my $uri = $proto->{uri} or confess('uri is required in prototype action');
my $label = exists $proto->{label} ? $proto->{label} : $proto_name;
my $action = Reaction::UI::ViewPort::URI->new(
location => join ('-', $loc, 'action', $i++),
uri => ( ref($uri) eq 'CODE' ? $uri->($target, $ctx) : $uri ),
display => ( ref($label) eq 'CODE' ? $label->($target, $ctx) : $label ),
);
push(@act, $action);
}
return \@act;
}
1;
__END__;
=head1 NAME
Reaction::UI::ViewPort::Role::Actions
=head1 DESCRIPTION
A role to ease attaching actions to L<Reaction::InterfaceModel::Object>s
=head1 ATTRIBUTES
=head2 actions
=head2 action_prototypes
=head1 AUTHORS
See L<Reaction::Class> for authors.
=head1 LICENSE
See L<Reaction::Class> for the license.
=cut
|