summaryrefslogtreecommitdiff
path: root/lib/ACME/AutoRedact.pm
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2016-04-26 11:54:00 +0100
committerdakkar <dakkar@thenautilus.net>2016-04-26 11:54:00 +0100
commitd0e6221c4479d9f0f2411d3e8d0ee4da2ed3c20d (patch)
tree4887cf28951d4c741f665bee26fbcce230835880 /lib/ACME/AutoRedact.pm
parenttweaks (diff)
downloadACME-AutoRedact-d0e6221c4479d9f0f2411d3e8d0ee4da2ed3c20d.tar.gz
ACME-AutoRedact-d0e6221c4479d9f0f2411d3e8d0ee4da2ed3c20d.tar.bz2
ACME-AutoRedact-d0e6221c4479d9f0f2411d3e8d0ee4da2ed3c20d.zip
mostly working
Diffstat (limited to 'lib/ACME/AutoRedact.pm')
-rw-r--r--lib/ACME/AutoRedact.pm91
1 files changed, 91 insertions, 0 deletions
diff --git a/lib/ACME/AutoRedact.pm b/lib/ACME/AutoRedact.pm
index e69de29..0b85712 100644
--- a/lib/ACME/AutoRedact.pm
+++ b/lib/ACME/AutoRedact.pm
@@ -0,0 +1,91 @@
+package ACME::AutoRedact;
+use strict;
+use warnings;
+# VERSION
+use Scope::Upper qw(localize :words);
+use Scalar::Util qw(blessed);
+
+# ABSTRACT: string-like object that can redact its value out of derived strings
+
+use overload
+ q{""} => \&stringify,
+ q{.} => \&concat,
+ fallback => 1,
+ ;
+
+sub _build__redacted {
+ my ($self) = @_;
+ return '*' x length($self->{value});
+}
+
+sub new {
+ my ($class,@args) = @_;
+
+ my $self;
+ if (@args==1 and not ref $args[0]) {
+ $self = { value => $args[0] };
+ }
+ elsif (@args==1) {
+ $self = $args[0];
+ }
+ else {
+ $self = { @args };
+ }
+ bless $self,$class;
+ $self->{_redacted} //= $self->_build__redacted;
+ return $self;
+}
+
+our $requested_behaviour;
+
+sub redact {
+ localize *requested_behaviour, \'redact', UP;
+}
+
+sub reveal {
+ localize *requested_behaviour, \'reveal', UP;
+}
+
+sub stringify {
+ my ($self) = @_;
+
+ my $behaviour = $requested_behaviour // $self->{default_behaviour} // 'reveal';
+
+ if ($behaviour eq 'reveal') {
+ return $self->{value};
+ }
+ else {
+ return $self->{_redacted};
+ }
+}
+
+sub concat {
+ my ($self,$other,$swap) = @_;
+
+ my %new;
+ if ((blessed($other)//'') eq __PACKAGE__) {
+ $new{value} = $swap
+ ? $other->{value} . $self->{value}
+ : $self->{value} . $other->{value};
+ $new{_redacted} = $swap
+ ? $other->{_redacted} . $self->{_redacted}
+ : $self->{_redacted} . $other->{_redacted};
+
+ $new{default_behaviour} = $swap
+ ? $other->{default_behaviour}
+ : $self->{default_behaviour};
+ }
+ else {
+ $new{value} = $swap
+ ? "$other" . $self->{value}
+ : $self->{value} . "$other";
+ $new{_redacted} = $swap
+ ? "$other" . $self->{_redacted}
+ : $self->{_redacted} . "$other";
+ $new{default_behaviour} = $self->{default_behaviour};
+ }
+
+ return ref($self)->new(\%new);
+}
+
+1;