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.
|
|---|