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

Give me something $self-ish

by bsb (Priest)
on Feb 21, 2003 at 04:45 UTC ( #237345=snippet: print w/replies, xml ) Need Help??
Description: I had a little library which supported a number of interfaces: procedural, class-based and object-based. The _shift_self function called as my $self = &_shift_self looks at the caller's @_ and Does-What-I-Mean, possibly shifting the first arg or returning a class name.

A bigger example will follow.

package MyClass;
use Scalar::Util qw(blessed);

sub _shift_self {
    if(!defined $_[0]) {
        return __PACKAGE__;
    } elsif(blessed $_[0]
            && $_[0]->isa(__PACKAGE__) ) {
        return shift;
    } elsif ( $_[0] =~ /^[_a-zA-Z][\w:']*$/ # Legit package names
            && $_[0]->isa(__PACKAGE__) ) {
        # should it be UNIVERSAL::isa($_[0],__PACKAGE); ??
        return shift;
    } else {
        return __PACKAGE__;

sub new {
    my $self = &_shift_self;
    my $class = ref $self || $self;
    return bless [1], $class;

sub dump_self {
    my $self = &_shift_self;

    print '$self is <',Dumper($self), '> ';
Replies are listed 'Best First'.
Re: Give me something $self-ish
by bsb (Priest) on Feb 21, 2003 at 04:51 UTC
    A bigger demo although it doesn't really show the usefulness.
    For me the usefulness was in easily providing multiple interfaces to the same C library.
Log In?

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

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (4)
As of 2022-05-18 12:11 GMT
Find Nodes?
    Voting Booth?
    Do you prefer to work remotely?

    Results (70 votes). Check out past polls.