}
default_config(
- template_dir => $FindBin::Bin.'/../share/html'
+ template_dir => 'share/html',
+ store => 'SQLite',
+ db_file => 'var/lib/idiotbox.db',
);
+sub BUILD {
+ my $self = shift;
+ my $store;
+ ($store = $self->config->{store}) =~ /^(\w+)$/
+ or die "Store config should be just a name, got ${store} instead";
+ my $store_class = "App::IdiotBox::Store::${store}";
+ eval "require ${store_class}; 1"
+ or die "Couldn't load ${store} store: $@";
+ $store_class->bind($self);
+}
+
+
dispatch {
sub (/) { $self->show_front_page },
subdispatch sub (/*/...) {
sub (/) {
$self->show_bucket($bucket)
},
- sub (/*) {
+ sub (/*/) {
$self->show_video($bucket->videos->get({ slug => $_[1] }));
}
]
method recent_announcements { $self->{recent_announcements} }
+method buckets { $self->{buckets} }
+
method show_front_page {
my $ann = $self->recent_announcements;
$self->html_response(
bless({ idiotbox => $idiotbox }, $class)->_bind;
}
-my $DSN = 'dbi:SQLite:idiotbox.db';
-
sub _new_db_store {
- DBIx::Data::Store->connect($DSN);
+ DBIx::Data::Store->connect("dbi:SQLite:$_[1]");
}
sub _bind {
my $self = shift;
my $idiotbox = $self->{idiotbox};
- my $db_store = $self->_new_db_store;
+ my $db_store = $self->_new_db_store($idiotbox->config->{db_file});
foreach my $to_bind (qw(recent_announcements buckets)) {
$idiotbox->{$to_bind} = _bind_set($to_bind, { raw_store => $db_store });
use App::IdiotBox;
use Data::Perl::Collection::Set;
+BEGIN { $INC{"App/IdiotBox/Store/Test.pm"} = __FILE__ }
+
+sub App::IdiotBox::Store::Test::bind {}
+
my $idiotbox = App::IdiotBox->new({
- config => { template_dir => 'share/html' }
+ config => {
+ store => 'Test'
+ }
});
my $ann = do {