package Net::Douban::APIFields; use base qw/Class::Accessor/; __PACKAGE__->mk_accessors(qw/Mecha Users Subjects APIKey PrivateKey AccessToken Consumer/); package Net::Douban; use base qw/Net::Douban::APIFields/; our $AUTOLOAD; sub new { balala... } sub AUTOLOAD { my $self = @_; my $name = $AUTOLOAD ; return if our $AUTOLOAD =~ /::DESTROY$/; $name =~ s/::(.*?)$/$1/g; if($name !~ /^Users|Subjects|Reviews$/){ croak "No such a method"; } if ( !$self->{"SUPER::$name"}) { $self->set( $name, "Net::Douban::$name"->new( mecha => $self->Mecha, apikey => $self->APIKey, access_token => $self->AccessToken, consumer => $self->Consumer, ) ); } return $self->{"SUPER::$name"}; } sub DESTROY {}; When I tried to run this code $douban = Net::Douban->new(); print Dumper $douban->Users;