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.