my $parser1 = HTML::TokePaser::Simple->new($file_name); my $parser2 = HTML::TokePaser::Simple->new($file_handle); my $parser3 = HTML::TokePaser::Simple->new($long_string); my $parser4 = HTML::TokePaser::Simple->new($uri); sub new { my $class = shift; my ($mode, $target) = (@_ == 1 ? $class->guess_mode($_[0]) : (), @_); my $source = ( $mode eq 'path' ) ? $target : ( $mode eq 'stringref' ) ? $target : ( $mode eq 'string' ) ? \$target : do { my $method = "source_for_$mode"; $class->$method( $target ) }; $class->SUPER::new( $source ); } sub guess_mode { my $class = shift; ( ref($_[0]) =~ /^IO|FileHandle/) ? 'handle' : ( ref($_[0]) eq 'SCALAR' ) ? 'stringref' : ( $_[0] =~ /^\w{3-6}\:/ ) ? 'uri' : ( length($_[0]) > 1024 ) ? 'string' : 'path'; } sub source_for_uri { my ($class, $uri) = @_; # ... }