* On Fri, May 02 2008, Eirik Berg Hanssen wrote:
> nadim khemir <[EMAIL PROTECTED]> writes:
>
>> On Friday 02 May 2008 01.24.00 Eirik Berg Hanssen wrote:
>>> use Test::More tests => 1;
>>> use Test::Trap;
>>> trap { warn "1\n2\n3" };
>>> $trap->warn_like(0, qr/1\n2\n3/);
>>
>> Ah! I like this. How did I miss this module??
>
>   Perhaps I just haven't been _quite_ shameless enough plugging it? ;-)
>
>> is it possible to have trap{} return an object/sub/whatever that is created 
>> by 
>> the trap{}. The automagic $trap is too automagic for me.
>
>   Possible?  Sure, if you wrap it up for that.  This is pure Perl,
> after all.  :)
>
>   Recommended?  Not really.  It kinda runs counter to the design.  The
> idea was for trap{}/$trap to mimic eval{}/$@; for one thing
> list/scalar/void context is propagated into the block; for another,
> $trap is a (package, but still) global, so you may localize it.
>
>   It seems to me any alternative interface will be either overly,
> un-perly verbose or else severely restricted.  But, granted, the
> severely restricted interface may be enough for you.

I think the most sane interface would be:

  my $trap = trap { ... };
  is $trap->foo, 'foo';
  is $trap->bar, 'bar';

You said you're trying to emulate $@, but $@ can be changed out from
under you rather easily, so instead of:

  eval { foo() };
  if($@){ error }

The defensive programmer will write:

  my $result = eval { foo() };
  if(!defined $result){ error } # use $@ for more details, if necessary.

This gives you more flexibility anyway:

  my $a = eval { try_something };
  my $b = eval { try_something_else };

  if(!$a && !$b){ die 'both alternatives failed!' }

Anyway, automatically setting variables should always be avoided,
regardless of whether or not it is "perlish".  I want correct tests, not
"perlish" tests.

Regards,
Jonathan Rockway

-- 
print just => another => perl => hacker => if $,=$"

Reply via email to