$Class::Accessor::Faster::VERSION
=
'0.51'
;
my
%slot
;
sub
_slot {
my
(
$class
,
$field
) =
@_
;
my
$n
=
$slot
{
$class
}->{
$field
};
return
$n
if
defined
$n
;
$n
=
keys
%{
$slot
{
$class
}};
$slot
{
$class
}->{
$field
} =
$n
;
return
$n
;
}
sub
new {
my
(
$proto
,
$fields
) =
@_
;
my
(
$class
) =
ref
$proto
||
$proto
;
my
$self
=
bless
[],
$class
;
$fields
= {}
unless
defined
$fields
;
for
my
$k
(
keys
%$fields
) {
my
$n
=
$class
->_slot(
$k
);
$self
->[
$n
] =
$fields
->{
$k
};
}
return
$self
;
}
sub
make_accessor {
my
(
$class
,
$field
) =
@_
;
my
$n
=
$class
->_slot(
$field
);
eval
sprintf
q{
sub {
return $_[0][%d] if scalar(@_) == 1;
return $_[0][%d] = scalar(@_) == 2 ? $_[1] : [@_[1..$#_]];
}
},
$n
,
$n
;
}
sub
make_ro_accessor {
my
(
$class
,
$field
) =
@_
;
my
$n
=
$class
->_slot(
$field
);
eval
sprintf
q{
sub {
return $_[0][%d] if @_ == 1;
my $caller = caller;
$_[0]->_croak(sprintf "'$caller' cannot alter the value of '%%s' on objects of class '%%s'", %s, %s);
}
},
$n
,
map
(perlstring(
$_
),
$field
,
$class
);
}
sub
make_wo_accessor {
my
(
$class
,
$field
) =
@_
;
my
$n
=
$class
->_slot(
$field
);
eval
sprintf
q{
sub {
if (@_ == 1) {
my $caller = caller;
$_[0]->_croak(sprintf "'$caller' cannot access the value of '%%s' on objects of class '%%s'", %s, %s);
}
else
{
return
$_
[0][
%d
] =
$_
[1]
if
@_
== 2;
return
(
shift
)->[
%d
] = \
@_
;
}
}
},
map
(perlstring(
$_
),
$field
,
$class
),
$n
,
$n
;
}
1;