summaryrefslogtreecommitdiff
path: root/lib/Enigmatic/Rotor.pm
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2011-08-29 13:06:32 +0100
committerdakkar <dakkar@thenautilus.net>2011-08-29 13:06:32 +0100
commit556f1e542cdeadb7dc2f549ec7915fe28f5bb112 (patch)
tree71585b0df498c971b485222a3b5cfd74b84ec413 /lib/Enigmatic/Rotor.pm
downloadEnigmatic-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.pm50
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') );
+}