#!/usr/bin/perl -w $SIG{__WARN__} = sub { return if $_[0] =~ /^Pseudo-hashes are deprecated/ }; use Test::More tests => 6; use strict; BEGIN { use_ok 'public'; use_ok 'private'; use_ok 'fields'; } # Test the example from the Class::Fields man page. package Test::Autoload::Example; use base qw(Class::Fields); use public qw(this that up down); use private qw(_left _right); use fields; use vars qw($AUTOLOAD); { no strict 'refs'; sub AUTOLOAD { my $self = $_[0]; my $class = ref $self; my($field) = $AUTOLOAD =~ /::([^:]+)$/; return if $field eq 'DESTROY'; # If its a public field, set up a named closure as its # data accessor. if ( $self->is_public($field) ) { *{$class."::$field"} = sub { my($self) = shift; if (@_) { $self->{$field} = shift; } return $self->{$field}; }; goto &{$class."::$field"}; } else { die "'$field' is not a public data member of '$class'"; } } } my $obj = fields::new(__PACKAGE__); $obj->this(42); ::is( $obj->this, 42 ); ::is( $obj->{this}, 42 ); eval { $obj->_left; }; ::like( $@, q[/^'_left' is not a public data member of 'Test::Autoload::Example'/] );