-
HOME
-
Tags
[ C::M::App ]
フレームワーク # お昼過ぎ、ふと思い立ってフレームワークを作り始めたので、記録残し
CGI::Simple か CGI::Minimal を使って、機能を減らして、もうちっとシンプルな俺仕様 CGI::Application が欲しい。CGI::Application 使ってると、いろんなことを覚えることができないワシはコピペが増えて困る
↓
イチから必要な機能だけ実装した方が楽かも。自分で実装したら覚えること減りそうだし
↓
CGI::Simple よさげだけど、どうせなら CGI::Minimal 使った方が極端で楽しいかも。これで CGI::Application より重くなったら、自分の実装が悪いということで
↓
CGI::Application のマネをするため、コード斜め読み
...
フレームワーク (2) # 「HikiDoc を使った WEB アプリケーション 」の時にはしりきれとんぼだったので、今回はちょっと続けてみようかと思う。今のところは
名称は CGI::Minimal::App (仮) ロジックは CGI::Application をほぼそのまま頂く 使い方が変わると、自分自身が使いづらくなるので 細かいあたりは、コーディングを楽しめるように自分流で CGI::Minimal の perldoc に「warnings と vars は重て!」とか書いてあるが、どうするかは作ってから考える CGI::Application::Plugin で、いつも使っているものは最初からいれてしまう
フレームワーク (3) - $obj->query() と $obj->param() # package CGI::Minimal::App; use strict; use warnings; use UNIVERSAL::require; sub query { my $self = shift; my $query = shift; # If query object is not exist, set a new query object. unless ( exists $self->{__QUERY_OBJ} ) { if ( defined $query ) { $self->{__QUERY_OBJ} = $query; } else { my $module = 'CGI::Minimal'; unless ( exists $INC{$module} ) { $module->require or die $!; } $self->{__QUERY_OBJ} = $module->new(); } } return $self->{__QUERY_OBJ}; } sub param : lvalue { my $self = shift; my @data = @_; # First use? Create new __PARAMS! $self->{__PARAMS} = {} unless exists $self->{__PARAMS}; if ( ref($data[0]) eq 'HASH' ) { # param($hash_ref) %{$self->{__PARAMS}} = (%{$self->{__PARAMS}}, %{$data[0]}); } elsif ( scalar(@data) % 2 == 0 ) { # param(@array) %{$self->{__PARAMS}} = (%{$self->{__PARAMS}}, @data); } scalar(@data) == 1 ? $self->{__PARAMS}->{$data[0]} : $self->{__PARAMS}; } C::A::P::Stash 的に param を使いたかった & lvalue 使ってみたかった
...
フレームワーク (4) - 枠組み完成 # 大枠できた。簡単なコマンドラインアプリは作れるレベル
PATH_INFO or QUERY_STRING で実行するメソッド振り分ける部分できた REQUEST_METHOD で実行するメソッド振り分ける部分できた TT 使う部分は未実装だが、構想はまとまった HTTP header をあつかう部分を構想中 CGI::Minimal の全機能使いたいかなぁ。。。と思案中 mod_perl とか fcgi とかについて思案中
フレームワーク (5) - 最低限の実装完了。。。したけど # 最低限の実装は完了した。。。が、このまま作り続けていくと「CGI::Application じゃあかんの? 自分用のラッパ書いたらええやん」ということになりそうな香りがプンプンと。。。そんだけ CGI::Application がよくできてるってことだなぁ
...
フレームワーク (6) - lvalue で validation もしたい # header_type というメソッドを実装していた時のこと。
package CGI::Minimal::App; sub header_type :lvalue { my $self = shift; $self->{__HEADER_TYPE}; } これで
$self->header_type(‘redirect’); $self->header_type = ‘redirect’; どちらの書き方でも setter として動作し、$self->header_type は getter にもなる。が、header_type に set できる値は制限したいので、
...
フレームワーク (7) - lvalue で validation もしたい - その2 - # もっとスマートな実装方法はないものか
って、絶対あるはず。Class::Accessor::Lvalue とかあるんじゃね? と思ったら、やっぱりあった。速度比較とかしているこんなサイトも見つけた
...
フレームワーク (8) - サブクラスでのメソッドのオーバーライドを禁止する # C::M::App は、CGI::Application と同様、自分のクラスから継承されることを想定している
...
フレームワーク (9) - DBIx::Simple::DeadObject # 今日は DBIx::Simple 周り
DB 関連のエラー拾うために、よく
$dbh->select(…) or die $dbh->error;
とかするが、わざとエラーにしてみるために
$dbh->disconnect;
$dbh->select(…) or die $dbh->error;
してみたら、
Database object no longer usable (because of …)
...
フレームワーク (10) - 現状整理 # 少し間があいてしまったが、やっていないわけではなくて、Template-Toolkit 関連部分の実装を終えたので、現在試用しながら実装変更中
...