Skip to content

Commit

Permalink
convert Hailo::Storage::* from Moose
Browse files Browse the repository at this point in the history
  • Loading branch information
avar committed Mar 21, 2010
1 parent 0fb885d commit cec7241
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 179 deletions.
2 changes: 2 additions & 0 deletions lib/Hailo/Engine/Default.pm
@@ -1,6 +1,8 @@
package Hailo::Engine::Default;

use 5.010;
use strict;
use parent 'Hailo::Role::Engine';
use List::Util qw<min first shuffle>;
use List::MoreUtils qw<uniq>;

Expand Down
12 changes: 2 additions & 10 deletions lib/Hailo/Role/Arguments.pm
@@ -1,16 +1,8 @@
package Hailo::Role::Arguments;

use 5.010;
use Any::Moose '::Role';
use Any::Moose 'X::Types::'.any_moose() => [qw/HashRef Str/];
use namespace::clean -except => 'meta';

has arguments => (
isa => HashRef[Str],
is => 'ro',
documentation => "Arguments passed from Hailo",
auto_deref => 1,
);

sub arguments { shift->{arguments} }

1;

Expand Down
33 changes: 14 additions & 19 deletions lib/Hailo/Role/Engine.pm
@@ -1,25 +1,20 @@
package Hailo::Role::Engine;

use 5.10.0;
use Any::Moose '::Role';
use Any::Moose 'X::Types::'.any_moose() => [qw< Int >];
use namespace::clean -except => 'meta';

has storage => (
required => 1,
is => 'ro',
documentation => "Our copy of the current Storage object",
);

has order => (
required => 1,
isa => Int,
is => 'rw',
documentation => "Our copy of the current markov order",
);

requires 'learn';
requires 'reply';

# Accessors
for my $method (qw[ storage order ]) {
no strict 'refs';
*{$method} = sub {
my ($self, @args) = @_;
return $self->{$method} unless @args;
return $self->{$method} = $args[0] if @args == 1;
die "not implemented";
};
}

sub learn { die }
sub reply { die }

1;

Expand Down
45 changes: 20 additions & 25 deletions lib/Hailo/Role/Storage.pm
@@ -1,31 +1,26 @@
package Hailo::Role::Storage;

use 5.010;
use Any::Moose '::Role';
use Any::Moose 'X::Types::'.any_moose() => [qw/Str Int/];
use namespace::clean -except => 'meta';

has brain => (
isa => Str,
is => 'rw',
);

has order => (
isa => Int,
is => 'rw',
);

has hailo => (
isa => 'Hailo',
is => 'ro',
);

requires 'ready';
requires 'save';
requires 'start_learning';
requires 'stop_learning';
requires 'start_training';
requires 'stop_training';
use parent qw[ Hailo::Role::Any Hailo::Role::Arguments ];
use strict;

# Accessors
for my $method (qw[ brain order hailo ]) {
no strict 'refs';
*{$method} = sub {
my ($self, @args) = @_;
return $self->{$method} unless @args;
return $self->{$method} = $args[0] if @args == 1;
die "not implemented";
};
}

sub ready { die }
sub save { die }
sub start_learning { die }
sub stop_learning { die }
sub start_training { die }
sub stop_training { die }

sub save {
# does nothing by default
Expand Down
87 changes: 23 additions & 64 deletions lib/Hailo/Storage.pm
@@ -1,60 +1,38 @@
package Hailo::Storage;

use 5.010;
use Any::Moose;
use Any::Moose 'X::Types::'.any_moose() => [qw<ArrayRef HashRef Int Str Bool>];
BEGIN {
return unless Any::Moose::moose_is_preferred();
require MooseX::StrictConstructor;
MooseX::StrictConstructor->import;
}
use strict;
use parent 'Hailo::Role::Storage';
use DBI;
use Hailo::Storage::Schema;

has dbd => (
isa => Str,
is => 'ro',
lazy_build => 1,
documentation => "The DBD::* driver we're using",
);

has dbd_options => (
isa => HashRef,
is => 'ro',
lazy_build => 1,
documentation => 'Options passed as the last argument to DBI->connect()',
);

sub _build_dbd_options {
# Accessors
for my $method (qw[ _engaged _boundary_token_id ]) {
no strict 'refs';
*{$method} = sub {
my ($self, @args) = @_;
return $self->{$method} unless @args;
return $self->{$method} = $args[0] if @args == 1;
die "not implemented";
};
}

sub dbd_options {
my ($self) = @_;
return {
RaiseError => 1
};
}

has dbh => (
isa => 'DBI::db',
is => 'ro',
lazy_build => 1,
documentation => 'Our DBD object',
);

sub _build_dbh {
sub dbh {
my ($self) = @_;
my $dbd_options = $self->dbi_options;

return DBI->connect($self->dbi_options);
return $self->{dbh} // ($self->{dbh} = do {
my $dbd_options = $self->dbi_options;
DBI->connect(@{ $self->dbi_options });
});
};

has dbi_options => (
isa => ArrayRef,
is => 'ro',
auto_deref => 1,
lazy_build => 1,
documentation => 'Options passed to DBI->connect()',
);

sub _build_dbi_options {
sub dbi_options {
my ($self) = @_;
my $dbd = $self->dbd;
my $dbd_options = $self->dbd_options;
Expand All @@ -70,30 +48,11 @@ sub _build_dbi_options {
return \@options;
}

has _engaged => (
isa => Bool,
is => 'rw',
default => 0,
documentation => 'Have we done setup work to get this database going?',
);

has sth => (
isa => HashRef,
is => 'ro',
lazy_build => 1,
documentation => 'A HashRef of prepared DBI statement handles',
);

sub _build_sth {
sub sth {
my ($self) = @_;
return Hailo::Storage::Schema->sth($self->dbd, $self->dbh, $self->order);
return $self->{sth} // ($self->{sth} = Hailo::Storage::Schema->sth($self->dbd, $self->dbh, $self->order));
}

has _boundary_token_id => (
isa => Int,
is => 'rw',
);

# bootstrap the database
sub _engage {
my ($self) = @_;
Expand Down Expand Up @@ -192,7 +151,7 @@ sub totals {
return $token, $expr, $prev, $next;
}

__PACKAGE__->meta->make_immutable;
1;

=encoding utf8
Expand Down
24 changes: 9 additions & 15 deletions lib/Hailo/Storage/MySQL.pm
@@ -1,28 +1,22 @@
package Hailo::Storage::MySQL;

use 5.010;
use Any::Moose;
BEGIN {
return unless Any::Moose::moose_is_preferred();
require MooseX::StrictConstructor;
MooseX::StrictConstructor->import;
}
use strict;
use parent 'Hailo::Storage';
use List::MoreUtils qw< all >;
use namespace::clean -except => 'meta';

extends 'Hailo::Storage';
with qw(Hailo::Role::Arguments Hailo::Role::Storage);

sub _build_dbd { return 'mysql' };
sub dbd { 'mysql' };

override _build_dbd_options => sub {
sub dbd_options {
my ($self) = @_;
return {
%{ super() },
%{ $self->SUPER::dbd_options },
mysql_enable_utf8 => 1,
};
};
}

sub _build_dbi_options {
sub dbi_options {
my ($self) = @_;
my $dbd = $self->dbd;
my $dbd_options = $self->dbd_options;
Expand Down Expand Up @@ -55,7 +49,7 @@ sub ready {
return all { exists $self->arguments->{$_} } qw(database username password);
}

__PACKAGE__->meta->make_immutable;
1;

=encoding utf8
Expand Down
25 changes: 9 additions & 16 deletions lib/Hailo/Storage/PostgreSQL.pm
@@ -1,27 +1,20 @@
package Hailo::Storage::PostgreSQL;

use 5.010;
use Any::Moose;
BEGIN {
return unless Any::Moose::moose_is_preferred();
require MooseX::StrictConstructor;
MooseX::StrictConstructor->import;
}
use namespace::clean -except => 'meta';

extends 'Hailo::Storage';
with qw(Hailo::Role::Arguments Hailo::Role::Storage);
use strict;
use parent 'Hailo::Storage';

sub _build_dbd { return 'Pg' };
sub dbd { 'Pg' };

override _build_dbd_options => sub {
sub dbd_options {
my ($self) = @_;
return {
%{ super() },
%{ $self->SUPER::dbd_options },
pg_enable_utf8 => 1,
};
};
}

sub _build_dbi_options {
sub dbi_options {
my ($self) = @_;
my $dbd = $self->dbd;
my $dbd_options = $self->dbd_options;
Expand Down Expand Up @@ -55,7 +48,7 @@ sub ready {
return exists $self->arguments->{dbname};
}

__PACKAGE__->meta->make_immutable;
1;

=encoding utf8
Expand Down

0 comments on commit cec7241

Please sign in to comment.