Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Re: XML::Parser Tutorial

by merlyn (Sage)
on Mar 07, 2001 at 21:11 UTC ( [id://62785]=note: print w/replies, xml ) Need Help??


in reply to Re: XML::Parser Tutorial
in thread XML::Parser Tutorial

Why do you want to subclass it? It works much better as a "has-a" than an "is-a", unless you want to get very cozy from the base class implementation, which is a maze of twisty tiny packages all alike.

Just delegate the methods that you want to provide in your interface, and handle the rest. Make a hash with one of the elements being your "inherited" parser. I believe it's called the "wrapper" pattern, but I don't name my patterns—I just use them!

-- Randal L. Schwartz, Perl hacker

Replies are listed 'Best First'.
Re: Re: Re: XML::Parser Tutorial
by gildir (Pilgrim) on Mar 07, 2001 at 21:40 UTC
    Well, but .... (there is allways a 'but') :-)

    Suppose I do not subclass XML::Parser. But then, how do I pass parameters to XML::Parser handler methods and collect results of their run without using global variables of XML::Parser package? Only class that I get to handler methods is expat itself and there is no place for any aditional parameters/results of handler methods.

    And if I subclass XML::Parser, only advantage that I gain is using my own package namespace for global variables instead of XML::Parser's namespace. This do not looks to me like a good example of object oriented programming style.

    Possible silution is the one mirod suggested using Non-Expat-Options but it is just a little bit less ugly than these two.

    There best solution will be forcing XML::Parser to use my custom subclass of XML::Parser::Expat instead of XML::Parser::Expat itself. Is there some way how to do that?

      The way to do this, without relying on the fact that the $p is a hashref, is to pass a closure as the handlers, and have an object that you created saved in the closure. This is how PerlSAX is implemented.

      Witness:

      my $handler = bless {}, "MyHandler";
      my $p = XML::Parser->new(Handlers => {
         Start => sub { $handler->handle_start(@_) } 
      });
      
      package MyHandler;
      
      sub handle_start {
        my ($handler, $p, $element, %attribs) = @_;
        ...
      }
      

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://62785]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (3)
As of 2024-03-28 15:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found