--- /dev/null
+package Text::Tradition::User;
+
+use strict;
+use warnings;
+
+use Moose;
+with qw(KiokuX::User);
+
+has 'password' => (is => 'rw', required => 1);
+has 'traditions' => (is => 'rw', isa => 'ArrayRef[Text::Tradition]', required => 0);
+
+# after add_tradition => sub {
+# $tradition->set_user($self)
+# unless $tradition->user->username eq $self->name;
+# }
+
+1;
--- /dev/null
+package Text::Tradition::UserStore;
+
+use strict;
+use warnings;
+
+use Moose;
+use KiokuX::User::Util qw(crypt_password);
+
+use Text::Tradition::User;
+use Text::Tradition::Directory;
+
+has 'directory' => ( is => 'rw', isa => 'KiokuX::Model');
+
+sub add_user {
+ my ($self, $username, $password) = @_;
+
+ my $user = Text::Tradition::User->new(
+ id => $username,
+ password => crypt_password($password),
+ );
+
+ my $scope = $self->directory->new_scope;
+ $self->directory->store($user->kiokudb_object_id, $user);
+
+ return $user;
+}
+
+sub find_user {
+ my ($self, $username) = @_;
+
+ return $self->directory->lookup($self->user_prefix . $username);
+
+}
+
+1;
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Test::More 'no_plan';
+use KiokuX::Model;
+use File::Temp;
+
+use_ok('Text::Tradition::UserStore');
+
+my $fh = File::Temp->new();
+my $file = $fh->filename;
+$fh->close;
+my $dsn = "dbi:SQLite:dbname=$file";
+my $d = KiokuX::Model->new( 'dsn' => $dsn,'extra_args' => { 'create' => 1 } );
+
+my $user_store = Text::Tradition::UserStore->new(directory => $d);
+
+my $new_user = $user_store->add_user('fred', 'bloggs');
+isa_ok($new_user, 'Text::Tradition::User');
+