diff options
author | dakkar <dakkar@thenautilus.net> | 2011-08-29 13:06:32 +0100 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2011-08-29 13:06:32 +0100 |
commit | 556f1e542cdeadb7dc2f549ec7915fe28f5bb112 (patch) | |
tree | 71585b0df498c971b485222a3b5cfd74b84ec413 /lib/Enigmatic/Rotor.pm | |
download | Enigmatic-556f1e542cdeadb7dc2f549ec7915fe28f5bb112.tar.gz Enigmatic-556f1e542cdeadb7dc2f549ec7915fe28f5bb112.tar.bz2 Enigmatic-556f1e542cdeadb7dc2f549ec7915fe28f5bb112.zip |
static rotors
Diffstat (limited to 'lib/Enigmatic/Rotor.pm')
-rw-r--r-- | lib/Enigmatic/Rotor.pm | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/Enigmatic/Rotor.pm b/lib/Enigmatic/Rotor.pm new file mode 100644 index 0000000..a600b43 --- /dev/null +++ b/lib/Enigmatic/Rotor.pm @@ -0,0 +1,50 @@ +package Enigmatic::Rotor; +use DAKKAR::p 'class'; +use Enigmatic::Types qw(WiringMap Letter RotorPos); + +has wiring => ( + is => 'ro', + isa => WiringMap, + coerce => 1, +); + +has ring_setting => ( + is => 'rw', + isa => RotorPos, + default => 0, +); + +around BUILDARGS => sub { + my $orig = shift; + my $class = shift; + + if ( @_ == 1 && !ref $_[0] ) { + return $class->$orig( wiring => $_[0] ); + } + else { + return $class->$orig(@_); + } +}; + +sub map { + my $self = shift; + my ($letter) = pos_validated_list( + \@_, + { isa => Letter }, + ); + + return $self->wiring->at($self->_apply_ring_setting($letter)); +} + +sub _apply_ring_setting { + my $self = shift; + my ($letter) = pos_validated_list( + \@_, + { isa => Letter }, + ); + + return chr( + (ord($letter) - ord('A') + $self->ring_setting) + % 26 + +ord('A') ); +} |