package Tie::Functions; use Carp; my %trans = qw( $ scalar @ array % hash * glob ); sub import { shift; my $type = shift; my $pkg = caller(0); my $ppkg = caller(1); croak "Type must be '\$', '\@', '%', '*', not '$type'." unless $type eq '$' or $type eq '@' or $type eq '%' or $type eq '*'; eval qq[ sub ${ppkg}::$_ (\\$type\@) { my \$arg = shift; my \$obj = tied $type\$arg; Carp::croak( "First arg to ${ppkg}::$_ must be $trans{$type} tied to $pkg" ) unless defined(\$obj) and \$obj->isa("$pkg"); return \$obj->\U$_\E(\@_); } ] for @_; } 1;