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

I find these two just to ugly.
my $parser3 = HTML::TokePaser::Simple->new_from_scalar($string);
Is just superfluous since we have already my $p = HTML::TokePaser::Simple->new(\$string);. If you want that novice users do the right, just give a example in the docs. A perl programmer has to learn about references anyway.

BTW: If you remove the reference from the new method since it is to hard for new users to use that, you should consider to remove references at all from HTML::TokePaser::Simple. I look down to $p->get_token and think this is no option but who knows. And nearly the same goes for my $p = HTML::TokePaser::Simple->new_from_fqdn($fqdn); a example in the docs is enough.
use LWP::Simple; my $content = get 'http://www.perlmonks.org/'; die "Can't get content" unless defined $content; HTML::TokePaser::Simple->new(\$content);
Or, add a hashref with lots of new options instead of more new like methods.
HTML::TokePaser::Simple->new({ url => 'http://www.perlmonks.org/' }); HTML::TokePaser::Simple->new({ scalar => $content });
Boris

Replies are listed 'Best First'.
Re^2: HTML::TokeParser::Simple advice requested
by simonm (Vicar) on Aug 13, 2004 at 21:55 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);

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

      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!