Re: accessor problem in OO

2006-05-29 Thread Chad Perrin
On Mon, May 29, 2006 at 06:39:57PM -0700, chen li wrote:
> 
> 
> --- Chad Perrin <[EMAIL PROTECTED]> wrote:
> 
> > On Mon, May 29, 2006 at 01:17:52PM -0700, chen li
> > wrote:
> > > Sorry but what I mean  is "Beginning Perl" from
> > > http://learn.perl.org/library/beginning_perl/
> > > 
> > > And BTW I have a hard copy of "Learning Perl" by  
> > > myself.
> > 
> > I had a sneaking suspicion you weren't talking about
> > the Llama book,
> 
> I don't know which book you mean by Llama book. I have
> several hard copies for Perl: Learning Perl( not very
> helpful), Begininig Perl (the online book),Programming
> Perl, Perl Cookbook, Begining Perl for Biomatics, and
> Mastering Perl for Bioinformatis. But I get much more
> help for the this forum, especially I have to learn
> verything what I need by myself during my spare time.

Learning Perl is often called the Llama Book because it has a llama on
the cover.  The book formerly known as Perl Objects, References, and
Modules is often called the Alpaca Book, and Programming Perl is often
called the Camel Book, for similar reasons.  You'll probably run into
these identification-by-animal terms again in the future.

Note: The new version of the Alpaca Book is called Intermediate Perl,
adding to the confusion of official names, and providing additional
motivation to use the term Alpaca Book when you're trying to indicate
the general book independent of its edition rather than trying to
specify an exact edition of it.

-- 
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]
"The measure on a man's real character is what he would do
if he knew he would never be found out." - Thomas McCauley

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-29 Thread chen li


--- Chad Perrin <[EMAIL PROTECTED]> wrote:

> On Mon, May 29, 2006 at 01:17:52PM -0700, chen li
> wrote:
> > Sorry but what I mean  is "Beginning Perl" from
> > http://learn.perl.org/library/beginning_perl/
> > 
> > And BTW I have a hard copy of "Learning Perl" by  
> > myself.
> 
> I had a sneaking suspicion you weren't talking about
> the Llama book,

I don't know which book you mean by Llama book. I have
several hard copies for Perl: Learning Perl( not very
helpful), Begininig Perl (the online book),Programming
Perl, Perl Cookbook, Begining Perl for Biomatics, and
Mastering Perl for Bioinformatis. But I get much more
help for the this forum, especially I have to learn
verything what I need by myself during my spare time.



> especially since it doesn't have any OOP instruction
> in it. 

 I wasn't
> aware there was an official online version of
> Beginning Perl, though.
> Thanks for the URL -- it might come in handy.
> 
> -- 
> Chad Perrin [ CCD CopyWrite |
> http://ccd.apotheon.org ]


__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-29 Thread Chad Perrin
On Mon, May 29, 2006 at 01:17:52PM -0700, chen li wrote:
> Sorry but what I mean  is "Beginning Perl" from
> http://learn.perl.org/library/beginning_perl/
> 
> And BTW I have a hard copy of "Learning Perl" by  
> myself.

I had a sneaking suspicion you weren't talking about the Llama book,
especially since it doesn't have any OOP instruction in it.  I wasn't
aware there was an official online version of Beginning Perl, though.
Thanks for the URL -- it might come in handy.

-- 
Chad Perrin [ CCD CopyWrite | http://ccd.apotheon.org ]
"A script is what you give the actors.  A program
is what you give the audience." - Larry Wall

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-29 Thread chen li
Sorry but what I mean  is "Beginning Perl" from
http://learn.perl.org/library/beginning_perl/

And BTW I have a hard copy of "Learning Perl" by  
myself.

Li  

--- "Randal L. Schwartz" 
wrote:

> > "chen" == chen li <[EMAIL PROTECTED]> writes:
> 
> chen> I recently read chapter 11 about OOP from the
> online
> chen> book "learning perl".  Here are some example
> codes
> chen> from chapeter 11:  
> 
> There is no "online book" named "Learning Perl".  If
> you see it online, please
> report the copyright violation to
> [EMAIL PROTECTED]  Please explain
> what you actually saw, and where.
> 
> -- 
> Randal L. Schwartz - Stonehenge Consulting Services,
> Inc. - +1 503 777 0095
> 
> http://www.stonehenge.com/merlyn/>
> Perl/Unix/security consulting, Technical writing,
> Comedy, etc. etc.
> See PerlTraining.Stonehenge.com for onsite and
> open-enrollment Perl training!
> 
> -- 
> To unsubscribe, e-mail:
> [EMAIL PROTECTED]
> For additional commands, e-mail:
> [EMAIL PROTECTED]
> 
> 
> 
> 
> 


__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-29 Thread Randal L. Schwartz
> "chen" == chen li <[EMAIL PROTECTED]> writes:

chen> I recently read chapter 11 about OOP from the online
chen> book "learning perl".  Here are some example codes
chen> from chapeter 11:  

There is no "online book" named "Learning Perl".  If you see it online, please
report the copyright violation to [EMAIL PROTECTED]  Please explain
what you actually saw, and where.

-- 
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
 http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-29 Thread chen li
Hi Peter,

Thank you very much,


Li



--- Peter Cornelius <[EMAIL PROTECTED]> wrote:

> 
> On May 27, 2006, at 3:56 PM, chen li wrote:
> >
> > Based on what I learn the regular method to defer
> a
> > hash reference to get specific value takes this
> > format:
> >
> > $ref_hash->{key1}
> >
> > but in this line
> > $_[0]->{_name}= $_[1] if defined $_[1]
> >
> > the format is
> > array element->{_name}
> >
> 
> Yes, the contents of the array element is a hash
> ref.  You could  
> rewrite this to be the equivalent
> 
> ${$_[0]}->{_name} = $_[1] if defined $_[1]
> 
> Using the '{}' around the $_[0] to more clearly mark
> it as a reference.
> 
> > Is the middle man $ref_hash is omitted in this
> format?
> > Does this what Perl really sees:
> >
> > $_[0]=$ref_hash;
> >
> > $ref_hash->{_name};
> >
> > and put these two lines into one line to make it
> > short:
> >
> > $_[0]->{_name}
> 
> It's not really omitted, rather the argument passed
> in was a hash  
> reference so the first element of the array ($_[0]) 
> is a hash  
> reference.  You could alias it by saying
> 
> $ref_hash = $_[0];
> 
> or, if you're feeling confident use it without the
> alias, as in this  
> example.
> 
> I guess this hash reference is being implicitly
> passed in by the  
> method call as part of Perl's OOP implementation so
> you never do see  
> the actual parameter passage of
> 
> name($ref_hash, $new_name)
> 
> Is this what's confusing you?
> 
> Hope this helps,
> PC
> 
> -- 
> To unsubscribe, e-mail:
> [EMAIL PROTECTED]
> For additional commands, e-mail:
> [EMAIL PROTECTED]
> 
> 
> 
> 
> 


__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-28 Thread D. Bolliger
Peter Cornelius am Montag, 29. Mai 2006 05.30:
> On May 27, 2006, at 3:56 PM, chen li wrote:
> > Based on what I learn the regular method to defer a
> > hash reference to get specific value takes this
> > format:
> >
> > $ref_hash->{key1}
> >
> > but in this line
> > $_[0]->{_name}= $_[1] if defined $_[1]
> >
> > the format is
> > array element->{_name}
>
> Yes, the contents of the array element is a hash ref.  You could
> rewrite this to be the equivalent
>
> ${$_[0]}->{_name} = $_[1] if defined $_[1]

I guess you meant ${$_[0]}{_name}

${$_[0]}{_name} and $_[0]->{_name} are equivalent, 
both '->' and ${} dereference the hashref.

[...]

> I guess this hash reference is being implicitly passed in by the
> method call as part of Perl's OOP implementation so you never do see
> the actual parameter passage of

This different usage of the '->' operator in OOP may be another source of 
confusion.

Class method: MyClass->new(@arguments)
implicitly passes @arguments preceeded by the string 'MyClass' to new()

Object method: $obj->handle(@arguments)
implicitly passes @arguments preceeded by the object $obj to handle()


Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-28 Thread Peter Cornelius


On May 27, 2006, at 3:56 PM, chen li wrote:


Based on what I learn the regular method to defer a
hash reference to get specific value takes this
format:

$ref_hash->{key1}

but in this line
$_[0]->{_name}= $_[1] if defined $_[1]

the format is
array element->{_name}



Yes, the contents of the array element is a hash ref.  You could  
rewrite this to be the equivalent


${$_[0]}->{_name} = $_[1] if defined $_[1]

Using the '{}' around the $_[0] to more clearly mark it as a reference.


Is the middle man $ref_hash is omitted in this format?
Does this what Perl really sees:

$_[0]=$ref_hash;

$ref_hash->{_name};

and put these two lines into one line to make it
short:

$_[0]->{_name}


It's not really omitted, rather the argument passed in was a hash  
reference so the first element of the array ($_[0])  is a hash  
reference.  You could alias it by saying


$ref_hash = $_[0];

or, if you're feeling confident use it without the alias, as in this  
example.


I guess this hash reference is being implicitly passed in by the  
method call as part of Perl's OOP implementation so you never do see  
the actual parameter passage of


name($ref_hash, $new_name)

Is this what's confusing you?

Hope this helps,
PC

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-27 Thread D. Bolliger
chen li am Sonntag, 28. Mai 2006 00.56:
[...]
> Thank you all for the reply.
>
>
> Based on what I learn the regular method to defer a
> hash reference to get specific value takes this
> format:
>
> $ref_hash->{key1}

yes, if $ref_hash is a hash reference, you get the value associated to the 
key 'key1'.

Try the following script, it shows you the structure of $ref_hash. If you are 
ever unclear of the structure of a variable, use Data::Dumper to inspect it. 
As you can note in the output, the definition is exactly the same as in line 
[1] (apart from the order and the variable name).

#!/usr/bin/perl

use strict; use warnings;

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]

use Data::Dumper;
print Data::Dumper::Dumper $ref_hash;


> but in this line
> $_[0]->{_name}= $_[1] if defined $_[1]
>
> the format is
> array element->{_name}

yes, because the array element $_[0] (the first element in the array @_) 
consists of a hash reference, and the -> operator accesses this hash 
reference.

At the point the -> operator does it's work, the fact that the hash reference 
is part of an array is no more relevant.

Compare the following script with the above one - the output is exactly the 
same.

#!/usr/bin/perl

use strict; use warnings;

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]
my @arr=($ref_hash); # array with one element: a hash ref

use Data::Dumper;
print Data::Dumper::Dumper $arr[0];


> Is the middle man $ref_hash is omitted in this format?
>
> Does this what Perl really sees:
>
> $_[0]=$ref_hash;
> $ref_hash->{_name};
> and put these two lines into one line to make it short:
> $_[0]->{_name}

More ore less. I'd say: You call the name() method of your object $obj (I call 
it $obj, not $ref_hash, to make clear its not only a hash reference, but a 
hash reference blessed into a class, that means: a perl object) with

  my $name_of_the_object=$obj->name;

This means, that $obj is passed to the name method as first argument. This 
first argument is passed in the @_ array, in the first position, wich is 
$_[0].

The name() method uses this $obj (and its attribute _name) by the line

   $_[0]->{_name}


Run the third script:

#!/usr/bin/perl

use strict; use warnings;

### Demo 1:

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]
my @arr=($ref_hash); # array with one element: a hash ref

if ($ref_hash == $arr[0]) {
   print '$ref_hash and $arr[0] are the same', "\n",
  "they have the addresses '$ref_hash' and '$arr[0]'\n\n\n";
}

### Demo 2;

package My;

sub new{
   my $class=shift;
   print "The class name is '$class'\n";
   return bless [EMAIL PROTECTED], $class
};

sub name {
   print "\$_[0] has address '$_[0]'\n";
   my $self=shift;
   print "\$self has address '$self'\n";
   return $self->{_name}
}

my $obj=My->new(_name=>'myname');
print "\$obj has address '$obj'\n";

print 'The name is `', $obj->name, "`\n";

>

Have a look into the perl documentation. You get an overview of it by typing

   perldoc perl

at the command line. Look for "objects", "data structure" etc.

Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-27 Thread chen li


--- Peter Cornelius <[EMAIL PROTECTED]> wrote:

> This might be a little more clear if you break down
> the way arguments  
> are being passed in and what they actually are.  It
> sounds like  
> you're aware that the arguments are passed in as a
> list name @_, it  
> looks like the arguments are something like this:
> 
> @_ = (   #< A list
>  {  _name => 'something' }, # < a hash
> reference (objects are  
> hashes in perl)
>  'some set name string'  #< a string
> );
> 
> The first version extracts the arguments so that you
> can refer to  
> them by names that might have some meaning to
> someone maintaining  
> your code latter on.  The second version accesses
> them directly.
> 
> > sub name{ #version 1
> >   my $self=shift;
> 
> shift is going to give you $_[0]
> 
> >
> >   my $set_name=shift;
> 
> This sets $set_name to $_[1]
> 
> >
> >$self->{_name}=$set_name if defined $set_name;
> >
> 
> So this is equivalent to
> $_[0]->{_name} = $_[1] if defined $_[1]
> the '->' is to dereference the hash reference stored
> in $_[0].
> 
> >return $self->{_name}
> >  }
> >
> >
> > Another version for the subroutine name
> >
> > sub name{ #verstion 2
> > $_[0]->{_name}=$_[1] if  defined }$_[1];
> > {$_[0]->{_name}
> >   }
> >
> > I feel a little bit confuse about the verion 2
> > subroutine name. The way it gets the value of
> > attribute name looks like this to me:
> > array element->{_name}
> >
> > (I know  that the $_[0] in the default array @_ is
> > actually an object $self. )
> 
> Hope this helps
> PC


Thank you all for the reply. 


Based on what I learn the regular method to defer a
hash reference to get specific value takes this
format:

$ref_hash->{key1} 

but in this line 
$_[0]->{_name}= $_[1] if defined $_[1]

the format is 
array element->{_name}

Is the middle man $ref_hash is omitted in this format?
Does this what Perl really sees:

$_[0]=$ref_hash;

$ref_hash->{_name};

and put these two lines into one line to make it
short: 

$_[0]->{_name}


Li






__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-27 Thread D. Bolliger
Anthony Ettinger am Samstag, 27. Mai 2006 22.02:
> sub foo
> {
>my $self = shift; #object
>
>if (@_ == 0) #any other arguments?
>{
>  return $self->{'foo'}; #getter (no other arguments)
>}
>
> return $self->{'foo'} = shift; # setter (save next argument)
>
> }

Hi together

This version could be written shorter (keeping the "shift $self" and premature 
return):

sub foo {
   my $self=shift;
   return $self->{foo} unless @_; # note the missing quotes (not necessary)
  # and the equality of [EMAIL PROTECTED] and 
@_==0
   $self->{foo}=$_[0];# note the missing return; returns the
  # last evaluated expression, which is the
  # assigned value
   # or: $self->{foo}=shift;
}

The above versions, as version 1 and version 2 below return 
the new attribute value, if it's set. Also in use are mutators that return 
the _old_ one.

Chen Li, also have a look at the (source code of) Class::Accessor and 
Class::Accessor::Fast modules; they can be used for the simple cases that an 
attribute is only got/set without doing anything additional work. They create 
accessors/mutators automatically (avoiding repetitive code if there are a lot 
of a/m) - at the cost of a little loss of performance.

> On 5/27/06, Peter Cornelius <[EMAIL PROTECTED]> wrote:
> > This might be a little more clear if you break down the way arguments
> > are being passed in and what they actually are.  It sounds like
> > you're aware that the arguments are passed in as a list name @_, it
> > looks like the arguments are something like this:
> >
> > @_ = (   #< A list
> >  {  _name => 'something' }, # < a hash reference (objects are
> > hashes in perl)
> >  'some set name string'  #< a string
> > );
> >
> > The first version extracts the arguments so that you can refer to
> > them by names that might have some meaning to someone maintaining
> > your code latter on.  The second version accesses them directly.
> >
> > > sub name{ #version 1
> > >   my $self=shift;
> >
> > shift is going to give you $_[0]
> >
> > >   my $set_name=shift;
> >
> > This sets $set_name to $_[1]
> >
> > >$self->{_name}=$set_name if defined $set_name;
> >
> > So this is equivalent to
> > $_[0]->{_name} = $_[1] if defined $_[1]
> > the '->' is to dereference the hash reference stored in $_[0].

which is created in the new() class method in the line
my [EMAIL PROTECTED];  

(
my [EMAIL PROTECTED]; # create (and assign) hash reference
my [EMAIL PROTECTED]; # create (and assign) array reference
)

> > >return $self->{_name}
> > >  }
> > >
> > >
> > > Another version for the subroutine name
> > >
> > > sub name{ #verstion 2
> > > $_[0]->{_name}=$_[1] if  defined }$_[1];
  v^
> > > {$_[0]->{_name}
> > >   }

There's a {} pair too much, leading to a syntax error

sub name {
   $_[0]->{_name}=$_[1] if defined $_[1];
   $_[0]->{_name};
}


> > > I feel a little bit confuse about the verion 2
> > > subroutine name. The way it gets the value of
> > > attribute name looks like this to me:
> > > array element->{_name}

It not only gets it from the hashref object, it also returns this value since 
this (the dereferencing of the attribute value) is the last expression in the 
object method.

(Compare the 
1; 
at the end of perl modules: A module must return a true value to indicate that 
is has been loaded successfully. It's good practice, although only neccessary 
if the evaluated expression before this "1;" would give a false value)

> > > (I know  that the $_[0] in the default array @_ is
> > > actually an object $self. )


Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-27 Thread Anthony Ettinger

sub foo
{
  my $self = shift; #object

  if (@_ == 0) #any other arguments?
  {
return $self->{'foo'}; #getter (no other arguments)
  }

   return $self->{'foo'} = shift; # setter (save next argument)

}

On 5/27/06, Peter Cornelius <[EMAIL PROTECTED]> wrote:

This might be a little more clear if you break down the way arguments
are being passed in and what they actually are.  It sounds like
you're aware that the arguments are passed in as a list name @_, it
looks like the arguments are something like this:

@_ = (   #< A list
 {  _name => 'something' }, # < a hash reference (objects are
hashes in perl)
 'some set name string'  #< a string
);

The first version extracts the arguments so that you can refer to
them by names that might have some meaning to someone maintaining
your code latter on.  The second version accesses them directly.

> sub name{ #version 1
>   my $self=shift;

shift is going to give you $_[0]

>
>   my $set_name=shift;

This sets $set_name to $_[1]

>
>$self->{_name}=$set_name if defined $set_name;
>

So this is equivalent to
$_[0]->{_name} = $_[1] if defined $_[1]
the '->' is to dereference the hash reference stored in $_[0].

>return $self->{_name}
>  }
>
>
> Another version for the subroutine name
>
> sub name{ #verstion 2
> $_[0]->{_name}=$_[1] if  defined }$_[1];
> {$_[0]->{_name}
>   }
>
> I feel a little bit confuse about the verion 2
> subroutine name. The way it gets the value of
> attribute name looks like this to me:
> array element->{_name}
>
> (I know  that the $_[0] in the default array @_ is
> actually an object $self. )

Hope this helps
PC

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 






--
Anthony Ettinger
Signature: http://chovy.dyndns.org/hcard.html

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




Re: accessor problem in OO

2006-05-27 Thread Peter Cornelius
This might be a little more clear if you break down the way arguments  
are being passed in and what they actually are.  It sounds like  
you're aware that the arguments are passed in as a list name @_, it  
looks like the arguments are something like this:


@_ = (   #< A list
{  _name => 'something' }, # < a hash reference (objects are  
hashes in perl)

'some set name string'  #< a string
);

The first version extracts the arguments so that you can refer to  
them by names that might have some meaning to someone maintaining  
your code latter on.  The second version accesses them directly.



sub name{ #version 1
  my $self=shift;


shift is going to give you $_[0]



  my $set_name=shift;


This sets $set_name to $_[1]



   $self->{_name}=$set_name if defined $set_name;



So this is equivalent to
$_[0]->{_name} = $_[1] if defined $_[1]
the '->' is to dereference the hash reference stored in $_[0].


   return $self->{_name}
 }


Another version for the subroutine name

sub name{ #verstion 2
$_[0]->{_name}=$_[1] if  defined }$_[1];
{$_[0]->{_name}
  }

I feel a little bit confuse about the verion 2
subroutine name. The way it gets the value of
attribute name looks like this to me:
array element->{_name}

(I know  that the $_[0] in the default array @_ is
actually an object $self. )


Hope this helps
PC

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
 




accessor problem in OO

2006-05-27 Thread chen li
Hi all,

I recently read chapter 11 about OOP from the online
book "learning perl".  Here are some example codes
from chapeter 11:  

sub new{
 my $class =shift;  
 my [EMAIL PROTECTED];  
 bless ($self, $class); 
 return $self  
}

sub name{ #version 1
  my $self=shift; 
  my $set_name=shift; 
   $self->{_name}=$set_name if defined $set_name; 
 
   return $self->{_name}
 } 


Another version for the subroutine name 

sub name{ #verstion 2
$_[0]->{_name}=$_[1] if  defined }$_[1]; 
{$_[0]->{_name}
  }

I feel a little bit confuse about the verion 2
subroutine name. The way it gets the value of
attribute name looks like this to me:
array element->{_name}

(I know  that the $_[0] in the default array @_ is
actually an object $self. )

Any comments about the format used in version 2?

Thanks,

Li


__
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]