in reply to Re: HTML::TokeParser::Simple advice requested
in thread HTML::TokeParser::Simple advice requested

Or, add a hashref with lots of new options instead of more new like methods.

++, but there's no need for a hash reference:

my $parser1 = HTML::TokePaser::Simple->new(path => $file_name); my $parser2 = HTML::TokePaser::Simple->new(handle => $file_handle); my $parser3 = HTML::TokePaser::Simple->new(string => $string); my $parser4 = HTML::TokePaser::Simple->new(fqdn => $fqdn);

And is there some reason a bit more auto-sensing couldn't be added to make these be typically implicit? Sure, to be safe, you'd want to use the two-argument form above, but for one-offs you could use the short form.

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) = @_; # ... }

Replies are listed 'Best First'.
Re^3: HTML::TokeParser::Simple advice requested
by borisz (Canon) on Aug 13, 2004 at 22:11 UTC
    Or, add a hashref with lots of new options instead of more new like methods. ++, but there's no need for a hash reference:
    my $parser1 = HTML::TokePaser::Simple->new(path => $file_name); my $parser2 = HTML::TokePaser::Simple->new(handle => $file_handle); my $parser3 = HTML::TokePaser::Simple->new(string => $string); my $parser4 = HTML::TokePaser::Simple->new(fqdn => $fqdn);
    I like it more. It is extensible, reusable and faster. Sure it is possible and a good solution too.
    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'; }
    Please no guess mode, this make a module unsable. I like pathnames > 1024, even if I do not type them, but I may use a module to parse my harddisk with a larger path. Also files on my disk contain ':' and so on.
    Boris
Re^3: HTML::TokeParser::Simple advice requested
by ihb (Deacon) on Aug 15, 2004 at 23:05 UTC

    For your &guess_mode to be safe, use objects instead,

    my $parser1 = HTML::TokePaser::Simple->new(IO::File::->new($file_n +ame)); my $parser2 = HTML::TokePaser::Simple->new($file_handle); my $parser3 = HTML::TokePaser::Simple->new($long_string); my $parser4 = HTML::TokePaser::Simple->new(URI::->new($uri));
    but now you can just as well use the named parameters style instead.

    ihb

    Read argumentation in its context!