package DFA::Set::Memory; use strict; use vars qw($VERSION @ISA); use Carp; use DFA::Set; $VERSION = '0.01'; @ISA=qw(DFA::Set); ##################################################################### sub add { my($self, $name, $obj, $state)=@_; $self->SUPER::add($name, $obj, $state); $self->{States}{$state}{objects}{$name}=$obj; $self->{Objects}{$name}=$state; return; } ##################################################################### sub remove { my($self, $name, $state)=@_; $state||=$self->find_state($name); croak "Removing unknown object $name" unless $state; croak "Removing object from unknown state $state" unless $state and exists $self->{States}{$state}; delete $self->{States}{$state}{objects}{$name}; delete $self->{Objects}{$name}; return; } ##################################################################### sub find_state { my($self, $name)=@_; return $self->{Objects}{$name}; } ##################################################################### sub find_payload { my($self, $name, $state)=@_; $state||=$self->find_state($name); return unless $state; return $self->{States}{$state}{objects}{$name}; } ##################################################################### sub list { my($self, $state)=@_; $self->SUPER::list($state); # returns a list of objects name return keys %{$self->{States}{$state}{objects}}; } ##################################################################### sub transition { my($self, $name, $newstate)=@_; my $rv=$self->SUPER::transition($name, $newstate); my $state=$self->find_state($name); my $obj=delete $self->{States}{$state}{objects}{$name}; $self->{States}{$newstate}{objects}{$name}=$obj; $self->{Objects}{$name}=$newstate; return $rv; } 1; __END__ # Below is the stub of documentation for your module. You better edit it! =head1 NAME DFA::Set::Memory - Deterministic Finite Automata set in memory =head1 SYNOPSIS use DFA::Set::Memory; $dfa=DFA::Set::Memory->new( States=>{ Foo=>[qw(Biff)], Biff=>[qw(Foo Bob)], Bob=>[], }, Terminal=>'Bob'); $dfa->add("bob", $bob, "Foo"); $dfa->add("bill", $bill, "Foo"); $dfa->transition(bob=>'Biff'); if($dfa->transition(bob=>'Bob')) { $dfa->remove('bob'); } $obill=$dfa->find_payload("bill"); =head1 DESCRIPTION DFA::Set::Memory is an implementation of DFA::Set that uses hashes to keep information in memory. =head1 METHODS All methods are documented in DFA::Set. =head1 AUTHOR Philip Gwyn =head1 SEE ALSO DFA::Set, DFA::Set::File, perl(1). =cut