DATAトークンと継承(2)
翌日
そもそも下記の件は
<CMS::Lite::View::Head=HASH(0x821b0e8)::DATA>←なんかこうなる
「ref $_[0] ならいけるんじゃないかと…」
というつっこみがありました。
結果
1. Baseクラスでref $_[0]を呼ぶように変更
package CMS::Lite::View::Base; use strict; use warnings; use utf8; use Text::MicroTemplate qw(build_mt); sub new { bless { __CACHE => undef }, $_[0] } sub edit_args { my $self = shift; my $args = @_ == 1 ? shift : {@_}; } sub template { my $pkgname = ref $_[0]; my $DATA_TOKEN = "$pkgname\::DATA"; $_[0]->{__CACHE} = do { local $/; <$DATA_TOKEN>; } unless $_[0]->{__CACHE}; } sub render { my $self = shift; my $args = $self->edit_args(@_); build_mt( $self->template )->($args)->as_string; }
2. Baseクラスをuse base
package CMS::Lite::View::Head; use strict; use warnings; use utf8; use base qw/CMS::Lite::View::Base/; 1; __DATA__ ? my $args = shift; <head> <meta http-equiv="content-type" content="text/html; charset=utf8" /> <title><?= $args->{title} ?> | <?= $args->{site_name} ?></title> <meta name="keywords" content="<?= join ', ', @{ $args->{keywords} } ?>" /> <meta name="description" content="<?= $args->{description} ?>" /> <meta name="author" content="<?= $args->{author} ?>" /> <meta name="copyright" content="<?= $args->{copyright} ?>" /> <meta name="robots" content="<?= $args->{robots} ?>" /> <link rel="stylesheet" type="text/css" media="screen" href="<?= $args->{css_file} ?>"/> </head>
となりました。
use baseにしたおかげでedit_argsを上書きしたり、継承できるようになりました。前回場合だとredefined〜とか出てきて鬱陶しかったのですが解決しました。
反省
また盛大に勘違いをした感がありますが、おかげでシンボルテーブルとグロブに詳しくなれたので省みない事にします。
ところでglobってglobal valiableの略でよいんですかね。でも Perlにはglobal valiable無いって書いてるなー??
% perldoc perlmod
NAME perlmod - Perl modules (packages and symbol tables) DESCRIPTION Packages Perl provides a mechanism for alternative namespaces to protect packages from stomping on each other’s variables. In fact, there’s really no such thing as a global variable in Perl.