http://qs1969.pair.com?node_id=304154


in reply to Re: hijacking a module constructor
in thread hijacking a module constructor

Ah. Right. Most useful. Thank you.

Except now I'm in a quandry.

My SVG::GD::Image code also imvokes GD::Image in order to continue to support existing GD functionality (all calls to the SVG::GD module are echoed to the GD module so that in the end the user can get an SVG output or a bitmap.

Is there any way to affect the symbol table everywhere except when GD::Image is called from within the SVG::GD::Image namespace?

Further over my head

Replies are listed 'Best First'.
Re: Re: Re: hijacking a module constructor
by Corion (Patriarch) on Nov 03, 2003 at 17:03 UTC

    Simply save yourself a copy of the GD:: namespace:

    *hackmare::GD:: = *GD::; # now use hackmare::GD instead of GD in your own library
    perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
      This does not seem to work.

      The GD:: namespace is not copying over... The Hackmare::GD namespace is getting pointed to the GD::Image namespace when the GD::Image copy takes place. I tried both:

      *Hackmare::GD::Image::new = \&GD::Image::new; and *Hackmare::GD::Image:: = GD::Image::;
      . Here is the debug output if it helps at all...
      *Hackmare::GD::Image::new = \&GD::Image::new; *GD::Image:: = *SVG::GD::Image::; package SVG::GD::Image; #constructor sub SVG::GD::Image::new { my $class = shift; my $self = {}; bless $self, $class; $self->{_GD_} = new Hackmare::GD::Image(@_) || print STDERR "Quitting. Unable to construct new GD::Image object using GD: $!\n"; ....stuff.... return $self }
      Here is the debugging info: Notice the infinite loop for the constructor:
      main::(test/18-loadsvggd.pl:6): print "Creating an SVG::GD Image\n"; DB<0> Creating an SVG::GD Image main::(test/18-loadsvggd.pl:7): my ($width,$height) = (200,200); DB<0> main::(test/18-loadsvggd.pl:8): my $dwg = new GD::Image($width,$height +); DB<0> s SVG::GD::Image::new(SVG/GD.pm:79): my $class = shift; DB<0> s SVG::GD::Image::new(SVG/GD.pm:80): my $self = {}; DB<0> SVG::GD::Image::new(SVG/GD.pm:81): bless $self, $class; DB<0> SVG::GD::Image::new(SVG/GD.pm:82): $self->{_GD_} = new Hackma +re::GD::Image(@_) SVG::GD::Image::new(SVG/GD.pm:83): || print STDERR " +Quitting. Unable to construct new GD::Image SVG::GD::Image::new(SVG/GD.pm:84): object using GD: $!\n" +; DB<0> s GD::Image::new(SVG/GD.pm:79): my $class = shift; DB<0> GD::Image::new(SVG/GD.pm:80): my $self = {}; DB<0> GD::Image::new(SVG/GD.pm:81): bless $self, $class; DB<0> GD::Image::new(SVG/GD.pm:82): $self->{_GD_} = new Hackmare:: +GD::Image(@_) GD::Image::new(SVG/GD.pm:83): || print STDERR "Quitt +ing. Unable to construct new GD::Image GD::Image::new(SVG/GD.pm:84): object using GD: $!\n"; DB<0> GD::Image::new(SVG/GD.pm:79): my $class = shift; DB<0> GD::Image::new(SVG/GD.pm:80): my $self = {}; DB<0> GD::Image::new(SVG/GD.pm:81): bless $self, $class;
      Is anything glaringly obvious here?

      hackmare.
        Untested idea.

        I have had much confusion about typeglob games in the past because I missed the simple fact that when Perl sees Foo::Bar it resolves what that will mean at compile time. Therefore rewriting what that should be at any other time is not going to cut it.

        Try rewriting the contents of the typeglob in a BEGIN block and see if that makes a difference. If you run into trouble, do lots of thinking about what things look like during compilation, and what they look like at runtime. (Keeping in mind how loading other things might overwrite stuff, and what operations happen when.)

        Good luck!

Re: Re: Re: hijacking a module constructor
by broquaint (Abbot) on Nov 03, 2003 at 17:16 UTC
    This can be done, but I think it may be saner to go down another route as suggested by Corion and perrin ...
    $GD::{$_} = $SVG::GD::{$_} for grep !/::$/, keys %SVG::GD::;
    This has a similar effect to the symbol table glob aliasing, but only affects the GD:: symbol table. Again, use with caution as this is even more hackish than the glob alias.
    HTH

    _________
    broquaint