---
name: "Plack::Runner"
section: "3pm"
platform: "linux"
package: "libplack-perl"
version: "1.0051-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Plack::Runner"
---

# Plack::Runner(3pm)

plackup core

## NAME

Plack::Runner - plackup core

## SYNOPSIS

```
  # Your bootstrap script
  use Plack::Runner;
  my $app = sub { ... };
  my $runner = Plack::Runner->new;
  $runner->parse_options(@ARGV);
  $runner->run($app);
```

## DESCRIPTION

Plack::Runner is the core of plackup runner script. You can create your own frontend to run your application or framework, munge command line options and pass that to `"run"` method of this class.

`"run"` method does exactly the same thing as the plackup script does, but one notable addition is that you can pass a PSGI application code reference directly to the method, rather than via `".psgi"` file path or with `"-e"` switch. This would be useful if you want to make an installable PSGI application.

Also, when `"-h"` or `"--help"` switch is passed, the usage text is automatically extracted from your own script using Pod::Usage.

## NOTES

Do not directly call this module from your `".psgi"`, since that makes your PSGI application unnecessarily depend on plackup and won't run other backends like Plack::Handler::Apache2 or mod\_psgi.

If you *really* want to make your `".psgi"` runnable as a standalone script, you can do this:

```
  my $app = sub { ... };
  unless (caller) {
      require Plack::Runner;
      my $runner = Plack::Runner->new;
      $runner->parse_options(@ARGV);
      $runner->run($app);
      exit 0;
  }
  return $app;
```

**WARNING**: this section used to recommend `"if (__FILE__ eq $0)"` but it's known to be broken since Plack 0.9971, since `$0` is now *always* set to the .psgi file path even when you run it from plackup.

## SEE ALSO

plackup
