| CGI-Application-Plugin-RunmodeDeclare documentation | Contained in the CGI-Application-Plugin-RunmodeDeclare distribution. |
CGI::Application::Plugin::RunmodeDeclare - Declare runmodes with keywords
version 0.09
package My::CgiApp;
use base 'CGI::Application';
use CGI::Application::Plugin::RunmodeDeclare;
startmode hello { "Hello!" }
runmode world($name) {
return $self->hello
. ', '
. $name || "World!";
}
errormode oops($c: $exception) {
return "Something went wrong at "
. $c->get_current_runmode
. ". Exception: $exception";
}
This module allows you to declare run modes with a simple keyword. It provides the same features as Method::Signatures::Simple.
It respects inheritance: run modes defined in the superclass are also available in the subclass.
Beyond automatically registering the run mode, and providing $self, it also
optionally pulls named parameters from $self->query->param or
$self->param.
runmode foo { $self->bar }
This declares the run mode "foo". Notice how $self is ready for use.
runmode bar ($c:) { $c->baz }
Same as above, only use $c instead of $self.
use CGI::Application::Plugin::RunmodeDeclare invocant => '$c';
runmode baz { $c->quux }
Same as above, but every runmode gets $c by default. You can still say runmode ($self:)
to rename the invocant.
runmode baz ( $id, $name ) {
return $self->wibble("I received $id and $name from a form submission
or a method invocation.");
}
Here, we specify that the method expects two parameters, $id and $name.
Values can be supplied through a method call (e.g. $self->baz(1, "me")),
or from the cgiapp object (e.g. $self->param( id => 42 )), or from the
query object (e.g. from /script?id=42;name=me).
runmode secret :Auth { ... }
Code attributes are supported as well.
This all works:
sub setup {
my $self = shift;
$self->run_modes([ qw/ foo / ]);
}
sub foo {
my $self = shift;
return $self->other;
}
runmode bar {
return $self->other;
}
sub other : Runmode {
my $self = shift;
return $self->param('other');
}
So you can still use the classic way of setting up run modes, and you can still use CGI::Application::Plugin::AutoRunmode, *and* you can mix and match.
Define the run mode that serves as $self->error_mode. You can only declare one
errormode per package.
Define the run mode that serves as $self->start_mode. You can only declare one
startmode per package.
Define run mode.
Rhesa Rozendaal, <rhesa at cpan.org>
You tried to install another errormode. Placeholders are filled with
* fully qualified name of existing errormode * file name * line number
You tried to install another startmode. Placeholders are filled with
* fully qualified name of existing startmode * file name * line number
Please report any bugs or feature requests to
bug-cgi-application-plugin-runmodedeclare at rt.cpan.org, or through the web
interface at
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=CGI-Application-Plugin-RunmodeDeclare.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc CGI::Application::Plugin::RunmodeDeclare
You can also look for information at:
http://rt.cpan.org/NoAuth/Bugs.html?Dist=CGI-Application-Plugin-RunmodeDeclare
http://annocpan.org/dist/CGI-Application-Plugin-RunmodeDeclare
http://cpanratings.perl.org/d/CGI-Application-Plugin-RunmodeDeclare
http://search.cpan.org/dist/CGI-Application-Plugin-RunmodeDeclare
Matt S. Trout for Devel::Declare, and Michael G. Schwern for providing the inspiration with Method::Signatures.
Copyright 2008 Rhesa Rozendaal, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| CGI-Application-Plugin-RunmodeDeclare documentation | Contained in the CGI-Application-Plugin-RunmodeDeclare distribution. |
package CGI::Application::Plugin::RunmodeDeclare; our $VERSION = '0.09'; use warnings; use strict;
use base 'Devel::Declare::MethodInstaller::Simple'; use Carp qw(croak); sub import { my $class = shift; my $caller = caller; my %remap = ( runmode => runmode => startmode => startmode => errormode => errormode => invocant => '$self' => into => $caller, @_ ); $class->install_methodhandler( into => $remap{into}, name => $remap{runmode}, pre_install => \&_setup_runmode, invocant => $remap{invocant}, ); $class->install_methodhandler( into => $remap{into}, name => $remap{startmode}, pre_install => \&_setup_startmode, invocant => $remap{invocant}, ); $class->install_methodhandler( into => $remap{into}, name => $remap{errormode}, pre_install => \&_setup_errormode, invocant => $remap{invocant}, ); } my %REGISTRY; # per-macro setup sub _split { my $n = shift; my ($p,$l) = $n =~ /^(.*?)(?:::(\w*))?$/; return ($p, $l); } sub _setup_runmode { my ($fullname, $code) = @_; my ($pkg, $name) = _split($fullname); $pkg->add_callback( init => sub { $_[0]->run_modes([ $name ]) } ); } sub _setup_startmode { my ($fullname, $code) = @_; no strict 'refs'; no warnings 'uninitialized'; my ($pkg, $name) = _split($fullname); # compile time check croak "start mode redefined (from $REGISTRY{$pkg}{start_mode_installed})" if $REGISTRY{$pkg}{start_mode_installed}; $pkg->add_callback( init => sub { # run time check return if exists $_[0]->{__START_MODE_SET_BY_RUNMODEDECLARE}; $_[0]->run_modes( [$name] ); $_[0]->start_mode($name); $_[0]->{__START_MODE_SET_BY_RUNMODEDECLARE} = 1; } ); $REGISTRY{$pkg}{start_mode_installed} = $fullname; } sub _setup_errormode { my ($fullname, $code) = @_; no strict 'refs'; no warnings 'uninitialized'; my ($pkg, $name) = _split($fullname); croak "error mode redefined (from $REGISTRY{$pkg}{error_mode_installed})" if $REGISTRY{$pkg}{error_mode_installed}; $pkg->add_callback( init => sub { return if exists $_[0]->{__ERROR_MODE_SET_BY_RUNMODEDECLARE}; $_[0]->error_mode($name); $_[0]->{__ERROR_MODE_SET_BY_RUNMODEDECLARE} = 1; } ); $REGISTRY{$pkg}{error_mode_installed} = $fullname; }
sub strip_name { my $ctx = shift; my $name = $ctx->SUPER::strip_name; $ctx->{pre_install}->($ctx->get_curstash_name . '::' . $name); return $name; } sub parse_proto { my $self = shift; my ($proto) = @_; $proto ||= ''; $proto =~ s/[\r\n]/ /sg; $proto =~ s/^\s+//; $proto =~ s/\s+$//; my $invocant = $self->{invocant}; $invocant = $1 if $proto =~ s{^(\$\w+):\s*}{}; my @args = map { m{^ ([\$@%])(\w+) }x ? [$1, $2] : () } split /\s*,\s*/, $proto ; return ( $invocant, $proto, @args, ); } # Turn the parsed signature into Perl code sub inject_parsed_proto { my $self = shift; my ($invocant, $proto, @args) = @_; my @code; push @code, "my $invocant = shift;"; push @code, "my ($proto) = \@_;" if defined $proto and length $proto; for my $sig (@args) { my ($sigil, $name) = @$sig; push @code, _default_for($sigil,$name,$invocant) if $sigil eq '$'; # CA->param only handles scalars push @code, _default_for($sigil,$name,"${invocant}->query"); } return join ' ', @code; } sub _default_for { my $sigil = shift; my $name = shift; my $invocant = shift; return "${sigil}${name} = ${invocant}->param('${name}') unless " . ( $sigil eq '$' ? 'defined' : '' ) . " ${sigil}${name}; "; } 1; # End of CGI::Application::Plugin::RunmodeDeclare __END__