package Wrapper; sub new { my($self, $wrapped) = @_; bless { wrapped => $wrapped }, $class; } sub AUTOLOAD { my $self = shift; our($AUTOLOAD) =~ s/.*:://o; my $method = $self->{wrapped}->can($AUTOLOAD); if($method) { unshift @_, $self->{wrapped}; goto $method; } else { # メソッドが存在しない場合はエラーでOK。 die 'wrapped has no method'; } } use overload nomethod => sub { my $self = shift; my $op = pop; my $method = overload::Method($self->{wrapped}, $op); if($method) { unshift @_, $self->{wrapped}; goto $method; } else { # errorを発生せずに # オーバーロードされていなかったことにして、 # デフォルトの挙動に戻したい。 } }; 1; __END__