perlで遅延評価の真似事

要はコンパイル時ではなくメソッド実行時に値を評価しやがれと。
何それどうすんのと思ってたけど神に聞いて実例見せてもらったので適当なサンプルで真似てみる。
俺要素が入り混じってるので合ってるかとか正しいかとかの保証は無し。

package Mod;
use base qw/Exporter/;
use strict;
use warnings;

our @EXPORT = qw/hoge/;

my $i = localtime;
warn  $i;
sub hoge { warn $i }

sub import {
    __PACKAGE__->export_to_level(1, @_);
    sleep 3;
    $i = localtime;
}

1;
% perl -MMod -le 'hoge()'
Mon Jun  1 13:13:37 2009 at Mod.pm line 9.
Mon Jun  1 13:13:40 2009 at Mod.pm line 10.

あと遅延評価するっつったらクロージャしか思いつかない。Mooseでも見たら何か分かるだろか。

use strict;
use warnings;

sub hoge {
    my $n = 1;
    return sub { $n++; print $n; };
}

my $c = hoge();
$c->();
$c->();
$c->();
% perl -l clo.pl
2
3
4


んで肝心の「遅延評価なんて使ってまで何したいの?」っていうのは保留。