package SO; use DynaLoader; sub new { my $class = shift; my $libname = shift; my $so = DynaLoader::dl_findfile( $libname ); die 'Failed to find .so for '.$libname unless defined( $so ); my $lib = DynaLoader::dl_load_file( $so, @_ ); die 'Failed to load '.$so unless $lib; return bless [ $lib, $so ], $class; }; sub AUTOLOAD { my $self = shift; my $sub = $AUTOLOAD; $sub =~ s/.*\:\://; warn 'called DL'; return $self->call( $sub, @_ ); }; sub DESTROY { my $self = shift; DynaLoader::dl_unload_file( $self->[0] ); }; sub call { my $self = shift; my $sym = shift; my $symref = DynaLoader::dl_find_symbol( $self->[0], $sym ); die 'failed to find '.$sym.' in '.$self->[1] unless $symref; DynaLoader::dl_install_xsub( $sym, $symref ); return &$sym( @_ ); }; 1;