use v6.d.PREVIEW; use Digest::MD5; use experimental :pack; class Ultramarine::Model::Users { has %!accounts; submethod BUILD(:%!accounts) {} multi method authenticate(:$user!,:$password! is copy) { $password ~~ s[^enc\:(.+)$] = pack('H*',$/[0]).decode('UTF-8'); return (%!accounts{$user} && %!accounts{$user} eq $password); } multi method authenticate(:$user!,:$token!,:$salt!) { return unless my $password = %!accounts{$user}; my $expected_token = Digest::MD5.md5_hex( $password ~ $salt ); return $token eq $expected_token; } }