This is some example code I wrote a few days ago. It's based on a odometer-class and a wheel-class. Maybe it's useful to someone.
EDIT: the class-variable $DONE in the odometer-class is a bad idea and should be changed to an instance-variable.
#!/usr/bin/perl
use strict;
use warnings;
package Wheel;
sub new {
my $class = shift;
my @items = @_;
my $self = {
items => \@items,
position => 0,
notch => [],
};
bless $self, $class;
return $self;
}
sub on_notch {
my $self = shift;
my $call = shift || sub { print "Notch!\n" };
push @{$self->{notch}}, $call;
}
sub succ {
my $self = shift;
if ($self->{position}++ < $#{$self->{items}}) {
$self->{position} and return $self->{items}->[$self->{position
+}];
} else {
$self->{position} = 0;
$_->() for @{$self->{notch}};
return $self->{items}->[$self->{position}];
}
}
sub to_s {
my $self = shift;
return $self->{items}->[$self->{position}];
}
package Odometer;
use Data::Dumper;
my $DONE = 0;
sub new {
my $class = shift;
my $self = [];
return bless $self, $class;
}
sub add_wheel {
my $self = shift;
my @items = @_;
my $w = Wheel->new(@items);
push @$self, $w;
$self->[$#$self-1]->on_notch(sub {$w->succ}) if $#$self > 0;
}
sub succ {
my $self = shift;
my $temp = $self->to_s;
$self->[0]->succ;
if ($DONE == 2) {
return undef;
} else {
$DONE++ if $DONE;
return $temp;
}
}
sub to_s {
my $self = shift;
return join ' ', map { $_->to_s } reverse @$self;
}
sub add_termination {
my $self = shift;
$self->[-1]->on_notch( sub { $DONE = 1} );
}
package main;
my $o = Odometer->new;
$o->add_wheel(qw/foo bar buz/);
$o->add_wheel(qw/dark light/);
$o->add_wheel(qw/red green blue yellow/);
$o->add_termination;
while (my $cur = $o->succ) {
print $cur . "\n";
};
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|