#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 18;
BEGIN {
use_ok('Test::IOC');
}
use IOC;
use IOC::Service::Prototype;
{
package FileLogger;
sub new {
my ($class, $log_file) = @_;
($log_file eq 'logfile.log') || die "Got wrong log file";
bless { log_file => $log_file } => $class;
}
sub log_file { (shift)->{log_file} }
package Application;
sub new {
my $class = shift;
bless { logger => undef } => $class
}
sub logger {
my ($self, $logger) = @_;
(UNIVERSAL::isa($logger, 'FileLogger')) || die "Got wrong logger type";
$self->{logger} = $logger;
}
sub run {}
}
my $container = IOC::Container->new('moose');
$container->register(IOC::Service::Literal->new('log_file' => "logfile.log"));
$container->register(IOC::Service::Prototype->new('logger' => sub {
my $c = shift;
return FileLogger->new($c->get('log_file'));
}));
$container->register(IOC::Service->new('application' => sub {
my $c = shift;
my $app = Application->new();
$app->logger($c->get('logger'));
return $app;
}));
my $reg = IOC::Registry->new();
$reg->registerContainer($container);
container_exists("/moose");
container_list_is("/", [ "moose" ], "... these are the containers in the reg");
service_list_is("/moose", [qw/application log_file logger/]);
service_exists("/moose/application");
service_isa("/moose/application", "Application");
service_is_deeply("/moose/application", $container->get("application"), "app is same as in container");
service_can("/moose/application", "logger");
service_can("/moose/application", "run");
service_exists("/moose/log_file");
service_is("/moose/log_file", $container->get("log_file"), "log file is same as in container");
service_exists("/moose/logger");
service_isa("/moose/logger", "FileLogger");
service_is_deeply("/moose/logger", $container->get("logger"), "logger service returned OK");
service_can("/moose/logger", "log_file");
service_is_literal("/moose/log_file");
service_is_prototype("/moose/logger");
service_is_singleton("/moose/application");