社内にNoPaste的なものがなくてカッとなって作っていたらsinatraライクなフレームワークを作っていた。何を言っているか(ry
NoNoPasteソースコード: http://github.com/kazeburo/NoNoPaste
元々、CloudForecastには、tokuhiromのMojaMojaやyusukebeのHitagiからコピペをしつつ作ったフレームワークがあり、NoPaste的なものを作成するにあたりCloudForecastからWAF部分だけを切り出して作り直した。
今回のWAFのコードはまだNoPasteのパッケージ内にある。名前はShirahata。
Shirataha.pm: http://github.com/kazeburo/NoNoPaste/blob/master/lib/Shirahata.pm
特徴は
- sinatraライクなURLの組み立て
- typesterさんのText::MicroTemplate::DataSectionExを利用してDATAにテンプレートを書きつつ、継承などをサポート
- 組み込みfillinformサポート
- Modelはナシ
あとはCatalyst風な”$c”も特徴かな。利用イメージとしてはCloudForecastのWeb画面のようなちょっとした管理ページ系かな
以下は簡単なサンプル
package MyApp;
use Shirahata -base;
get '/' => sub {
my ( $self, $c ) = @_;
# $c->req, $c->res, $c->stash, $c->args
$c->render('index')
}
__DATA__
@@ base.mt
<html>
<head>
<title>My App</title>
</head>
<body>
<h1><a href="<?= $c->req->uri_for('/') ?>">MyApp</a></h1>
? block content => sub { }
</body>
</html>
@@ index.mt
? extends 'base'
? block content => sub {
<h2>Content</h2>
? fillinform( $c->req, sub {
<form method="post" action="/submit" id="submitf">
<label for="nick">nick</label>
<input type="text" id="nick" name="nick" value="" size="21" />
<input type="submit" id="submitb" value="POST" />
</form>
? })
? } #block content
呼び出すためのpsgi。
use strict;
use warnings;
use Cwd qw/realpath/;
use File::Basename qw/dirname/;
use MyApp;
my $root_dir = dirname( realpath(__FILE__) );
my $web = MyApp->new($root_dir);
$web->psgi;
Xslateも試してみていて、DATAをtempdirに書き出して、Xslateに読み込ませるとか考えたんだけど、一時ディレクトリの掃除が大変なのでやめた。DataSectionのXslate版はgfx曰く「絶賛考え中です!」なので楽しみにしている
CloudForecastにbackportするかどうか考え中