An iterator needs to keep some metadata around to know where it is in the data feed. That poses problems for both your ideas. A class method needs lots of internal bookkeeping to distinguish between calls for one instance and another. It will be a poor choice.

An instance method needs bookkeeping to distinguish between one depth of loop and another in nested iteration. Like Perl's each hash iterator, most implementations don't bother, and just live with the restriction to a single loop.

The general solution is to make the iterator an object of its own. Here's an incomplete sketch,

package Feed::Iterator; sub new { my ($class, $feed) = @_; my $self = _init($feed); bless $self, $class; } sub gimme { # . . . } package Feed; sub iter { my $self = shift; Feed::Iterator->new($self) }
That way you have a Feed instance method which returns a Feed::Iterator object that keeps its own state. The bookkeeping is shoved off onto the perl call stack where it belongs.

See Limbic~Region's tutorial How To: Make An Iterator for all the fine details.

After Compline,
Zaxo


In reply to Re: Iterator as a Class or Object Method by Zaxo
in thread Iterator as a Class or Object Method by arc_of_descent

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.