NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.
All the Perl that's Practical to Extract and Report
Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.
No ducks (Score:1)
But the common Perl 5 solution does seem to be "If it got passed in as a filehandle, assume it's a filehandle". Though I'm not claiming that's not problematic (many modules die spectactularly and unhelpfully if passed the wrong parameters, rather than giving a useful "invalid usage" exception), is it really worth getting your module's users to have to create an iterator function wrapping a filehandle purely because there
osfameron
Re:No ducks (Score:1)
So, yeah, a simple solution is to make it explicit: pass in a named foo_data that's a scalar or foo_stream that's a coderef... or something like that. Then again, with _CALLABLE, a litt
rjbs
Nigglies (Score:1)
Now how do we tell that it's an iterator coderef? How do we know that this coderef that the user invented to satisfy your API actually works?
Because that's yet another type of bug, one that's probably even harder to find again.
Oh, and as for your tell and seek, there's a role for that already, called IO::Seekable. IO::Handle on it's own DOESN'T assume that the filehandle is seekable, it may well be a stream.
So something like IO::File responds to both ->isa('IO::Handle') and -
Re:Nigglies (Score:1)
That's a big improvement from "if our undisclosed criterion for being a filehandle passes, we will diamond your value." Even if they disclose their method (which would be unusual) it means you have to know what it is. Callability is a solved problem, as I see it.
rjbs
eval{} has its points... (Score:1)
>This sucks the most. It work as long as $data is
>callable and returns something true. (It could be
>tweaked to work as long as it's callable, but would
>get even uglier and no better.)
IMO It gets a little better:
my $result;
if (eval { $result=$data->(); 1 }) {
}
Re:eval{} has its points... (Score:1)
rjbs