diff options
author | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-10-11 21:15:47 +0000 |
---|---|---|
committer | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2008-10-11 21:15:47 +0000 |
commit | 37728bbad6840485e4d0e3a504dfdc851e7378c3 (patch) | |
tree | 0b971b7451c5fff6e554090f22ff881005729d5f /lib/Reaction/UI/ViewPort/Role/Actions.pm | |
parent | 487c32080762a25ad34c785dc39753cbc941d355 (diff) | |
download | reaction-37728bbad6840485e4d0e3a504dfdc851e7378c3.tar.gz reaction-37728bbad6840485e4d0e3a504dfdc851e7378c3.zip |
completely new way of handling action prototypes for actions in CRUD that is much saner and less reliant on $ctx. also more flexible and configurable
Diffstat (limited to 'lib/Reaction/UI/ViewPort/Role/Actions.pm')
-rw-r--r-- | lib/Reaction/UI/ViewPort/Role/Actions.pm | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/lib/Reaction/UI/ViewPort/Role/Actions.pm b/lib/Reaction/UI/ViewPort/Role/Actions.pm index 7da0072..a8e6e28 100644 --- a/lib/Reaction/UI/ViewPort/Role/Actions.pm +++ b/lib/Reaction/UI/ViewPort/Role/Actions.pm @@ -1,33 +1,64 @@ package Reaction::UI::ViewPort::Role::Actions; use Reaction::Role; -use Reaction::UI::ViewPort::Action::Link; +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 ; +} -has actions => (is => 'ro', isa => 'ArrayRef', lazy_build => 1); -has action_prototypes => (is => 'ro', isa => 'ArrayRef', lazy_build => 1); -sub _build_action_prototypes { [] }; sub _build_actions { my ($self) = @_; my (@act, $i); my $ctx = $self->ctx; my $loc = $self->location; - foreach my $proto (@{ $self->action_prototypes }) { - my $action = Reaction::UI::ViewPort::Action::Link->new - ( - ctx => $ctx, - target => $self->model, - location => join ('-', $loc, 'action', $i++), - %$proto, - ); + 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; |