package My::IO; use Moose::Policy 'Moose::Policy::GlobRefObject'; use Moose; has 'filename' => ( is => 'ro', isa => 'Str', required => 1 ); sub new { my $class = shift; my $self = Moose::Object::new($class, @_); select select my $fh; ${*$fh} = $self; return bless $fh => $class; } sub open { my $fh = shift; my $self = ${*$fh}; open $fh, $self->filename or confess "cannot open"; return $fh; } sub getlines { my $fh = shift; return readline $fh; } my $io = new My::IO filename=>'/etc/passwd'; print "filename=", $io->filename, "\n"; $io->open; print $io->getlines;