Does your module pass the 'empty subclass' test? If you say
C<@SUBCLASS::ISA = qw(YOURCLASS);> your applications should be able
to use SUBCLASS in exactly the same way as YOURCLASS. For example,
-does your application still work if you change: C<$obj = new YOURCLASS;>
-into: C<$obj = new SUBCLASS;> ?
+does your application still work if you change: C<< $obj = YOURCLASS->new(); >>
+into: C<< $obj = SUBCLASS->new(); >> ?
Avoid keeping any state information in your packages. It makes it
difficult for multiple other packages to use yours. Keep state
use Thread;
- $thr = new Thread \&sub1;
+ $thr = Thread->new( \&sub1 );
sub sub1 {
print "In the thread\n";
use Thread;
$Param3 = "foo";
- $thr = new Thread \&sub1, "Param 1", "Param 2", $Param3;
- $thr = new Thread \&sub1, @ParamList;
- $thr = new Thread \&sub1, qw(Param1 Param2 $Param3);
+ $thr = Thread->new( \&sub1, "Param 1", "Param 2", $Param3 );
+ $thr = Thread->new( \&sub1, @ParamList );
+ $thr = Thread->new( \&sub1, qw(Param1 Param2 $Param3) );
sub sub1 {
my @InboundParameters = @_;
use the join() method.
use Thread;
- $thr = new Thread \&sub1;
+ $thr = Thread->new( \&sub1 );
@ReturnData = $thr->join;
print "Thread returned @ReturnData";
automatically.
use Thread;
- $thr = new Thread \&sub1; # Spawn the thread
+ $thr = Thread->new( \&sub1 ); # Spawn the thread
$thr->detach; # Now we officially don't care any more
use Thread qw(async);
use Thread::Queue;
- my $DataQueue = new Thread::Queue;
+ my $DataQueue = Thread::Queue->new();
$thr = async {
while ($DataElement = $DataQueue->dequeue) {
print "Popped $DataElement off the queue\n";
use Thread qw(yield);
use Thread::Semaphore;
- my $semaphore = new Thread::Semaphore;
+ my $semaphore = Thread::Semaphore->new();
$GlobalVariable = 0;
- $thr1 = new Thread \&sample_sub, 1;
- $thr2 = new Thread \&sample_sub, 2;
- $thr3 = new Thread \&sample_sub, 3;
+ $thr1 = Thread->new( \&sample_sub, 1 );
+ $thr2 = Thread->new( \&sample_sub, 2 );
+ $thr3 = Thread->new( \&sample_sub, 3 );
sub sample_sub {
my $SubNumber = shift @_;
sub tester {
my $thrnum = shift @_;
- my $bar = new Foo;
+ my $bar = Foo->new();
foreach (1..10) {
print "$thrnum calling per_object\n";
$bar->per_object($thrnum);
6 use Thread;
7 use Thread::Queue;
8
- 9 my $stream = new Thread::Queue;
- 10 my $kid = new Thread(\&check_num, $stream, 2);
+ 9 my $stream = Thread::Queue->new();
+ 10 my $kid = Thread->new(\&check_num, $stream, 2);
11
12 for my $i ( 3 .. 1000 ) {
13 $stream->enqueue($i);
19 sub check_num {
20 my ($upstream, $cur_prime) = @_;
21 my $kid;
- 22 my $downstream = new Thread::Queue;
+ 22 my $downstream = Thread::Queue->new();
23 while (my $num = $upstream->dequeue) {
24 next unless $num % $cur_prime;
25 if ($kid) {
26 $downstream->enqueue($num);
27 } else {
28 print "Found prime $num\n";
- 29 $kid = new Thread(\&check_num, $downstream, $num);
+ 29 $kid = Thread->new(\&check_num, $downstream, $num);
30 }
31 }
32 $downstream->enqueue(undef) if $kid;
=item 5.
X<constructor> X<new>
-References are often returned by special subroutines called constructors.
-Perl objects are just references to a special type of object that happens to know
-which package it's associated with. Constructors are just special
-subroutines that know how to create that association. They do so by
-starting with an ordinary reference, and it remains an ordinary reference
-even while it's also being an object. Constructors are often
-named new() and called indirectly:
-
- $objref = new Doggie (Tail => 'short', Ears => 'long');
-
-But don't have to be:
+References are often returned by special subroutines called constructors. Perl
+objects are just references to a special type of object that happens to know
+which package it's associated with. Constructors are just special subroutines
+that know how to create that association. They do so by starting with an
+ordinary reference, and it remains an ordinary reference even while it's also
+being an object. Constructors are often named C<new()>. You I<can> call them
+indirectly:
+
+ $objref = new Doggie( Tail => 'short', Ears => 'long' );
+
+But that can produce ambiguous syntax in certain cases, so it's often
+better to use the direct method invocation approach:
$objref = Doggie->new(Tail => 'short', Ears => 'long');