--- /dev/null
+package LolCatalyst::Lite::Translator::Scramble;
+
+use Moose;
+
+# stolen from Catalyst::Plugin::Acme::Scramble
+
+sub shuffle {
+ for ( my $i = @_; --$i; ) {
+ my $j = int(rand($i+1));
+ @_[$i,$j] = @_[$j,$i];
+ }
+}
+
+sub _scramble_word {
+ my $word = shift || return '';
+ my @piece = split //, $word;
+ shuffle(@piece[1..$#piece-1])
+ if @piece > 2;
+ join('', @piece);
+}
+
+sub _scramble_block {
+ my $text = shift;
+
+ ${$text} =~ s{
+ ( (?:(?<=[^[:alpha:]])|(?<=\A))
+ (?<!&)(?-x)(?<!&#)(?x)
+ (?:
+ ['[:alpha:]]+ | (?<!-)-(?!-)
+ )+
+ (?=[^[:alpha:]]|\z)
+ )
+ }
+ {_scramble_word($1)}gex;
+}
+
+use namespace::clean -except => 'meta';
+
+sub translate {
+ my ($self, $text) = @_;
+ _scramble_block(\$text);
+ return $text;
+}
+
+1;
--- /dev/null
+use strict;
+use warnings;
+use Test::More qw(no_plan);
+use LolCatalyst::Lite::Translator;
+
+ok(
+ (my $tr = LolCatalyst::Lite::Translator->new),
+ 'Constructed translator object ok'
+);
+
+my $input = 'hello world';
+my $scrambled = $tr->translate_to('Scramble', $input);
+
+like($scrambled, qr/h...o w...d/, 'text matches first/last');
+isnt($scrambled, $input, 'text altered');