Catalyst::Action - Catalyst Action


Catalyst-Runtime documentation Contained in the Catalyst-Runtime distribution.

Index


Code Index:

NAME

Top

Catalyst::Action - Catalyst Action

SYNOPSIS

Top

    <form action="[%c.uri_for(c.action)%]">

    $c->forward( $action->private_path );

DESCRIPTION

Top

This class represents a Catalyst Action. You can access the object for the currently dispatched action via $c->action. See the Catalyst::Dispatcher for more information on how actions are dispatched. Actions are defined in Catalyst::Controller subclasses.

METHODS

Top

attributes

The sub attributes that are set for this action, like Local, Path, Private and so on. This determines how the action is dispatched to.

class

Returns the name of the component where this action is defined. Derived by calling the Catalyst::Component/catalyst_component_name (catalyst_component_name) method on each component.

code

Returns a code reference to this action.

dispatch( $c )

Dispatch this action against a context.

execute( $controller, $c, @args )

Execute this action's coderef against a given controller with a given context and arguments

match( $c )

Check Args attribute, and makes sure number of args matches the setting. Always returns true if Args is omitted.

compare

Compares 2 actions based on the value of the Args attribute, with no Args having the highest precedence.

namespace

Returns the private namespace this action lives in.

reverse

Returns the private path for this action.

private_path

Returns absolute private path for this action. Unlike reverse, the private_path of an action is always suitable for passing to forward.

name

Returns the sub name of this action.

meta

Provided by Moose.

AUTHORS

Top

Catalyst Contributors, see Catalyst.pm

COPYRIGHT

Top


Catalyst-Runtime documentation Contained in the Catalyst-Runtime distribution.
package Catalyst::Action;

use Moose;
use Scalar::Util 'looks_like_number';
with 'MooseX::Emulate::Class::Accessor::Fast';
use namespace::clean -except => 'meta';

has class => (is => 'rw');
has namespace => (is => 'rw');
has 'reverse' => (is => 'rw');
has attributes => (is => 'rw');
has name => (is => 'rw');
has code => (is => 'rw');
has private_path => (
  reader => 'private_path',
  isa => 'Str',
  lazy => 1,
  required => 1,
  default => sub { '/'.shift->reverse },
);

use overload (

    # Stringify to reverse for debug output etc.
    q{""} => sub { shift->{reverse} },

    # Codulate to execute to invoke the encapsulated action coderef
    '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; },

    # Make general $stuff still work
    fallback => 1,

);



no warnings 'recursion';

sub dispatch {    # Execute ourselves against a context
    my ( $self, $c ) = @_;
    return $c->execute( $self->class, $self );
}

sub execute {
  my $self = shift;
  $self->code->(@_);
}

sub match {
    my ( $self, $c ) = @_;
    #would it be unreasonable to store the number of arguments
    #the action has as its own attribute?
    #it would basically eliminate the code below.  ehhh. small fish
    return 1 unless exists $self->attributes->{Args};
    my $args = $self->attributes->{Args}[0];
    return 1 unless defined($args) && length($args);
    return scalar( @{ $c->req->args } ) == $args;
}

sub compare {
    my ($a1, $a2) = @_;

    my ($a1_args) = @{ $a1->attributes->{Args} || [] };
    my ($a2_args) = @{ $a2->attributes->{Args} || [] };

    $_ = looks_like_number($_) ? $_ : ~0
        for $a1_args, $a2_args;

    return $a1_args <=> $a2_args;
}

__PACKAGE__->meta->make_immutable;

1;

__END__