hasを作る。
Moose やら Mouse やらで
has があるけど、どうやって実装してんのかな〜?と軽く思ったので
それと同じ事が出来ないか、試してみた。
えっと、ちょっと考えて作っただけなんで、超適当です。
・Elch.pm(Mooseがシカらしいんで、独語でシカにしてみた)
package Elch;
use Exporter;
@ISA = (Exporter);
@EXPORT = qw(has);
my ($class, $file, $line) = caller;
sub has {
my $method = shift;
my ($arg) = @_;
my $routine = {};
if (exists $arg->{'is'}) {
my $is = $arg->{'is'};
if ($is eq 'ro') {
$routine = sub {
die "this is readonly" if scalar @_ > 1;
return $_[0]->{$method};
};
} elsif ($is eq 'rw') {
$routine = sub {
return $_[0]->{$method} = $_[1];
};
}
}
*{"${class}::${method}"} = $routine;
}
*{"${class}::new"} = sub {
my $self = shift;
my (%arg) = @_;
my $member = {};
foreach my $key (keys %arg) {
$member->{$key} = $arg{$key};
}
bless $member, $self;
};
1;
・Mensch.pm
package Mensch;
use Elch;
has name => {
'is' => "ro",
};
1;
・test.pl
こんな感じなのかも。#!/usr/bin/perl -w
use strict;
use Mensch;
my $obj = Mensch->new(name => 'anigon');
print $obj->name, "\n";
exit;