All pastes #634004 Raw Edit

無題

public text v1 · immutable
#634004 ·published 2007-07-26 02:45 UTC
rendered paste body
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__