天然パーマです。

素PlackアプリとMojoliciousアプリを同居させる

Plack::App::URLMap 使えば出来るんですが... リクエストをPlack::Requestとしてゴニョってレスポンスが配列リファレンスなコードリファレンスを返す「 素Plack 」なアプリと Mojolicious アプリをパスによって振り分けて同居させるもうひとつの方法の例。

Web::MojoliciousはMojoliciousクラスを継承したアプリのベースクラスね。to_appメソッドでコードリファレンス返しているんで.psgiではこれを呼び出せばOK。ってかもう一度言いますがほとんどのケースは Plack::App::URLMap で間に合うかと思われます。

package Web;
use strict;
use warnings;
use Plack::Request;
use Web::Mojolicious;
use Mojo::Server::PSGI;

sub new {
    my ($class, %opt) = @_;
    my $self = bless {}, $class;
    my $mojo_app = Mojo::Server::PSGI->new( app => Web::Mojolicious->new );
    $self->{mojo_app} = $mojo_app;
    return $self;
}

sub to_app {
    my $self = shift;
    return sub {
        my $env = shift;
        my $req = Plack::Request->new($env);
        if( $req->path_info =~ m!^/mojo! ) {
            return $self->{mojo_app}->run($req->env);
        }
        return [200, [ 'Content-Type' => 'text/plain' ], ['This is not Mojolicious app.']]
    }
}

1;

Plack::Requestのインスタンスを使ってディスパッチする前とかに2つのアプリ共通の処理が起こるケースあるかなーと思って考えてみた次第。三度言いますが Plack::App::URLMap でおおよそ解決出来るかと!