-
Notifications
You must be signed in to change notification settings - Fork 14
/
PrivilegeControlled.pm
46 lines (32 loc) · 1.29 KB
/
PrivilegeControlled.pm
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
package Wing::Role::Result::PrivilegeControlled;
use Wing::Perl;
use Ouch;
use Moose::Role;
=head1 NAME
Wing::Role::Result::PrivilegeControlled - Make your Wing objects controllable by users with specific privileges.
=head1 SYNOPSIS
with 'Wing::Role::Result::PrivilegeControlled';
__PACKAGE__->wing_controlled_by_privilege('pizza_manager');
__PACKAGE__->wing_viewed_by_privilege('pizza_employee');
=head1 DESCRIPTION
Use this role in your object when you want to allow objects to be edited by users that have specific privileges that have been set in advance. Use L<Wing::Role::Result::PrivilegeField> to define those privileges.
=cut
sub wing_controlled_by_privilege {
my ($class, $privilege_name) = @_;
my $is_method_name = 'is_'.$privilege_name;
$class->meta->add_around_method_modifier( can_edit => sub {
my ($orig, $self, $user) = @_;
return 1 if (defined $user && $user->$is_method_name);
return $orig->($self, $user);
});
}
sub wing_viewed_by_privilege {
my ($class, $privilege_name) = @_;
my $is_method_name = 'is_'.$privilege_name;
$class->meta->add_around_method_modifier( can_view => sub {
my ($orig, $self, $user) = @_;
return 1 if (defined $user && $user->$is_method_name);
return $orig->($self, $user);
});
}
1;