Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: questions about bless's second argument

by Fletch (Bishop)
on Nov 19, 2020 at 23:54 UTC ( [id://11123863]=note: print w/replies, xml ) Need Help??


in reply to questions about bless's second argument

One possible usage: imagine if you had some sort of factory method and wanted to create subclasses on the fly. Handwavy terrible example just what you could do with it (use a real metaprogramming module instead):

## In Widget sub make_color_widget { my $class = shift; my $new_color = shift; my( @widget_args ) = @_; { no strict refs; @{ qq{Widget::${new_color}::ISA } = (qw( Widget ) ); } my $self = {@widget_args}; return bless $self, qq{Widget::$new_color}; } sub my_color { my $self = shift; return ( (ref $self) =~ m{^Widget::(.*)} )[0]; }

Then you could do something like:

$ perl -I . -MWidget -de 0 Loading DB routines from perl5db.pl version 1.57 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(-e:1): 0 DB<1> $red = Widget->make_color_widget( red => () ); DB<2> $blue = Widget->make_color_widget( blue => () ); DB<3> x $red->my_color 0 'red' DB<4> x $blue->my_color 0 'blue'

Rather than cheating and scraping from the instance's class name, you could use that as a key to lookup whatever in a hash keyed by the class name. Or you could (dynamically) generate code and populate subs in the new class' package namespace (*{"Widget::${new_color}::frobulate} = sub { ... }

Edit: a possible usage other than the obvious that's how subclasing works, of course. (derp)

The cake is a lie.
The cake is a lie.
The cake is a lie.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (4)
As of 2024-04-19 05:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found