Ark入門

PSGIにも対応しているモダンなWeb application frameworkであるArkに入門してみました。

まずはアプリの生成から

ark.pl newapp Happy::Wedding

これでModule::Setupをつかったフレーバーからアプリのひな形が生成されます。

続いて、Controllerをつくります。

ark.pl controller LoveArk

controllerも簡単に生成できます

Creating directory /Users/dann/.arkhelper/controller
Creating directory /Users/dann/.arkhelper/controller/plugins
Creating directory /Users/dann/.arkhelper/controller/flavors
Creating /Users/dann/.arkhelper/controller/flavors/default/template/lib/____var-ark_app_path-var____/Controller/____var-ark_target_path-var____.pm
Creating directory /Users/dann/.arkhelper/controller/flavors/default/additional
Dump config /Users/dann/.arkhelper/controller/flavors/default/additional/config.yaml
Creating directory /Users/dann/.arkhelper/controller/flavors/default/plugins
Creating directory /Users/dann/.arkhelper/controller/flavors/default/template
Dump config /Users/dann/.arkhelper/controller/flavors/default/config.yaml
Creating directory .
Creating lib/Happy/Wedding/Controller/LoveArk.pm

次はCatalystと同じようにルーティング設定をかいて、レスポンスを返すようにします。

package Happy::Wedding::Controller::LoveArk;
use Ark 'Controller';

sub index :Path :Args(0) {
    my ($self, $c) = @_; 
    $c->res->body('Happy Wedding');
}

1;

ここまできたら起動します。plackに対応しているので、以下のようにするだけで起動します。

plackup -app app.psgi                         
[debug] Loaded Path actions:
.-------------------------------------+--------------------------------------.
| Path                                | Private                              |
+-------------------------------------+--------------------------------------+
| /                                   | /index                               |
| /                                   | /default                             |
| /loveark                            | /loveark/index                       |
'-------------------------------------+--------------------------------------'

[debug] Setup finished
Accepting connections at http://0:5000/

おお、いいですね。
これで、http://localhost:5000/loveark にアクセスすると、さきほどコントローラに書いたHappy Weddingが表示されます。

おぉぉぉぉ。

ここまで作るにあたり、githubのHEADではMouse0.40では動作しないところがあったので、Arkのほうのパッチを作っておきました。

From 6f633d9ab5bffa5b1f369c36cae6aebbb318c88b Mon Sep 17 00:00:00 2001
From: Dann <techmemo@gmail.com>
Date: Tue, 10 Nov 2009 02:23:30 +0900
Subject: [PATCH] remove make_immutable call because make_immutable method doesn&#39;t exist in latest Mouse::Role

---
 lib/Ark/Command/Flavor/Newapp.pm         |    2 +-
 lib/Ark/Command/Interface.pm             |    3 +--
 lib/Ark/Command/Interface/ModuleSetup.pm |    2 +-
 3 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/lib/Ark/Command/Flavor/Newapp.pm b/lib/Ark/Command/Flavor/Newapp.pm
index 9be7557..0db4fd1 100644
--- a/lib/Ark/Command/Flavor/Newapp.pm
+++ b/lib/Ark/Command/Flavor/Newapp.pm
@@ -32,7 +32,7 @@ template: |
   
   use [% module %];
   
-  my $app = MyApp->new;
+  my $app = [% module %]->new;
   $app->setup;
   
   builder {
diff --git a/lib/Ark/Command/Interface.pm b/lib/Ark/Command/Interface.pm
index 113d418..5894795 100644
--- a/lib/Ark/Command/Interface.pm
+++ b/lib/Ark/Command/Interface.pm
@@ -85,5 +85,4 @@ sub search_app {
     $app;
 }
 
-__PACKAGE__->meta->make_immutable;
-
+1;
diff --git a/lib/Ark/Command/Interface/ModuleSetup.pm b/lib/Ark/Command/Interface/ModuleSetup.pm
index f26a5b3..522ed50 100644
--- a/lib/Ark/Command/Interface/ModuleSetup.pm
+++ b/lib/Ark/Command/Interface/ModuleSetup.pm
@@ -58,4 +58,4 @@ sub run {
     }
 }
 
-__PACKAGE__->meta->make_immutable;
+1;
-- 
1.5.5.1

起動も軽く、とてもいい感じです。
週末のArkthonが楽しみですね。Happy hacking!

# gfxさんへ。Mouse側のバグではなくて、Ark側のバグかと。