Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Re: Dynamically Changing Packages w/out Eval

by betterworld (Curate)
on Aug 24, 2009 at 12:15 UTC ( [id://790795]=note: print w/replies, xml ) Need Help??

in reply to Dynamically Changing Packages w/out Eval

Some funny code I wrote yesterday (the technique can be probably used for your problem too):

use Symbol qw(qualify_to_ref); use overload; my $stashref = qualify_to_ref("${namespace}::"); package tmp; local *tmp:: = *$stashref; overload->import('+' => sub { my $self = shift; my ($other, $info) = @_; # do some stuff });

This sets up overloaded operators for the namespace with the computed name $namespace.

Note that you cannot use "main" instead of "tmp", because the main namespace seems to be too read-only for this kind of hack (you'd get the error "Modification of read-only value attempted")

Replies are listed 'Best First'.
Re^2: Dynamically Changing Packages w/out Eval
by ikegami (Patriarch) on Aug 24, 2009 at 13:41 UTC
    A lot simpler and a lot less fragile:
    my @overload = ('+' => sub { my $self = shift; my ($other, $info) = @_; # do some stuff }); eval "package $namespace; use overload \@overload; 1" or die $@;
      I thought the original question was how to avoid eval :)
        True, but he wanted to avoid eval "because it obfuscates the code". It's clearly the opposite here.
        You can't expect someone to read the OP

Log In?

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

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-06-18 06:39 GMT
Find Nodes?
    Voting Booth?

    No recent polls found

    erzuuli‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.