Thanks, Randy.
sub AUTOLOAD { my $self = shift; (my $attr = $AUTOLOAD) =~ s/.*:://; return if $attr eq 'DESTROY';
my ($type) = $self->{_spec_impl}->attr_data($attr); my $sub;
if ($type eq 'SCALAR') { $sub = $self->_mk_scalar_accessor($attr); } elsif ($type eq 'ARRAY') { $sub = $self->_mk_array_accessor($attr); } elsif ($type eq 'HASH') { $sub = $self->_mk_hash_accessor($attr); } else { croak "Unsupported attribute '$attr'"; }
{ no strict 'refs'; *{$AUTOLOAD} = $sub; $sub->($self, @_); } }
sub _mk_scalar_accessor { my $self = shift; my $attr = shift;
return sub { my $self = shift; my $arg = shift;
my $ret = $self->{_metadata}{$attr};
if ($arg) { my $spec = $self->{_spec_impl};
if ($self->{auto_check} && $spec->can("C_$attr")) { my $changing = eval "\$spec->C_$attr(\$arg)"; carp sprintf($changing, $attr) if $changing; }
if ($self->{auto_validate} && $spec->can("V_$attr")) { my $is_valid = eval "\$spec->V_$attr(\$arg)"; if ($is_valid) { $self->{_metadata}{$attr} = $arg; } else { carp "Invalid value for $attr: '$arg'"; } } else { $self->{_metadata}{$attr} = $arg; } } return $ret; } }
sub _mk_array_accessor { my $self = shift; my $attr = shift;
return sub { my $self = shift; my @arg = @_;
my $ret = $self->{_metadata}{$attr} || [];
if (@arg) { my $spec = $self->{_spec_impl};
if ($self->{auto_check} && $spec->can("C_$attr")) { my $changing = eval "\$spec->C_$attr(\$arg)"; carp sprintf($changing, $attr) if $changing; }
if ($self->{auto_validate} && $spec->can("V_$attr")) { my $is_valid = eval "\$spec->V_$attr([EMAIL PROTECTED])"; if ($is_valid) { $self->{_metadata}{$attr} = [EMAIL PROTECTED]; } else { carp "Invalid value for $attr: [EMAIL PROTECTED]"; } } else { $self->{_metadata}{$attr} = [EMAIL PROTECTED]; } } return @$ret; } }
sub _mk_hash_accessor { my $self = shift; my $attr = shift;
return sub { my $self = shift; my %arg = @_;
my $ret = $self->{_metadata}{$attr} || {};
if (%arg) { my $spec = $self->{_spec_impl};
if ($self->{auto_check} && $spec->can("C_$attr")) { my $changing = eval "\$spec->C_$attr(\$arg)"; carp sprintf($changing, $attr) if $changing; }
if ($self->{auto_validate} && $spec->can("V_$attr")) { my $is_valid = eval "\$spec->V_$attr(\%arg)"; if ($is_valid) { $self->{_metadata}{$attr} = \%arg; } else { carp "Invalid value for $attr: {%arg}"; } } else { $self->{_metadata}{$attr} = \%arg; } } return %$ret; } }
-- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>