Create a constructor named the same as your package name!
merlyn
created: 2004-07-01 08:47:22
Why type ->new? Have your package create a function so that the package name itself is the constructor! For example, you can have:
my $e = Example::Module->new(@list);
or
my $e = Example::Module(@list);
Both are supported by the snippet code! Even works if ->new is inherited, and doesn't disturb any other class methods.
package Example::Module;

...

sub Example::Module {
  return "Example::Module" unless @_;
  Example::Module::->new(@_); # extra colons are necessary
}

...

Re: Create a constructor named the same as your package name!
created: 2004-07-01 09:03:01
So you've created a subroutine in some other namespace. That's not something I'd want to encourage.
•Re^2: Create a constructor named the same as your package name!
created: 2004-07-01 10:15:20
It's arguably your namespace, because if someone else were to create that subroutine name, it would mess up all of your class methods.

-- Randal L. Schwartz, Perl hacker
Be sure to read my standard disclaimer if this is a reply.

Re: Create a constructor named the same as your package name!
created: 2004-07-01 09:41:56
Neat idea, but what if a constructor needs no arguments?

--Solo
--
You said you wanted to be around when I made a mistake; well, this could be it, sweetheart.
Re^2: Create a constructor named the same as your package name!
created: 2004-07-01 12:15:11

I'm confused, what's wrong with this?

my $e = Example::Module();
•Re^3: Create a constructor named the same as your package name!
created: 2004-07-01 12:19:09
my $e = Example::Module();
That would be the same as:
my $e = "Example::Module";
So no, it doesn't work. I thought about it for a while... and I can't figure out a way around that corner case that doesn't break other class methods. Oh well... gotta say "new" sometime, I guess.

-- [http://www.stonehenge.com/merlyn/|Randal L. Schwartz, Perl hacker]
Be sure to read [id://205373|my standard disclaimer] if this is a reply.

Re^4: Create a constructor named the same as your package name!
created: 2004-07-03 02:16:52

There is one way that you can overcome it. It's pretty bad, though. :/

#!/usr/bin/perl -l

package Example::Module;

use overload '""' => sub { ref shift };

sub new {
    bless [ $_[1] || "default" ], shift;
}

sub Example::Module {
    return Example::Module::->new(@_);
}

sub print_it {
    print $_[0]->[0];
}

package main;

$a = Example::Module();
$a->print_it;

$b = Example::Module("b");
$b->print_it;
__END__
default
b

Yeah. Not very pretty, I know. Also, it breaks if no parameters is an illegal option (i.e. your constructor returns undef or dies). This would come into play for calls such as Example::Module->print_it. Of course in that case you may as well just return "Example::Module" as the original code had.

antirice    
The first rule of Perl club is - use Perl
The
ith rule of Perl club is - follow rule i - 1 for i > 1

perlmonks.org content © perlmonks.org and antirice, DrHyde, jryan, merlyn, Solo

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03