X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FAction.pm;h=b0f60cbb202ef80625dd8a0a40ebca234db0528e;hb=cbe555e8935736ebb018aa19ef4b44051b429977;hp=e2e78b689156976a5c5a5341dbedcbaaf98b9fac;hpb=536bee890cf24e0e4bcda7562e7b70cc03ca0620;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Action.pm b/lib/Catalyst/Action.pm index e2e78b6..b0f60cb 100644 --- a/lib/Catalyst/Action.pm +++ b/lib/Catalyst/Action.pm @@ -18,8 +18,9 @@ L subclasses. =cut 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'); @@ -28,8 +29,6 @@ has attributes => (is => 'rw'); has name => (is => 'rw'); has code => (is => 'rw'); -no Moose; - use overload ( # Stringify to reverse for debug output etc. @@ -38,6 +37,10 @@ use overload ( # Codulate to execute to invoke the encapsulated action coderef '&{}' => sub { my $self = shift; sub { $self->execute(@_); }; }, + # Which action takes precedence + 'cmp' => 'compare', + '<=>' => 'compare', + # Make general $stuff still work fallback => 1, @@ -70,6 +73,18 @@ sub match { 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; @@ -105,6 +120,11 @@ context and arguments Check Args attribute, and makes sure number of args matches the setting. Always returns true if Args is omitted. +=head2 compare + +Compares 2 actions based on the value of the C attribute, with no C +having the highest precedence. + =head2 namespace Returns the private namespace this action lives in.