Created
December 21, 2011 08:57
-
-
Save Meettya/1505295 to your computer and use it in GitHub Desktop.
Change logger but nor realized Ilogger
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env perl | |
use v5.10; | |
use warnings; | |
#=================================== | |
package ClobalConstructor; | |
#=================================== | |
use Moo; | |
use Kaiten::Container; | |
has 'config' => ( is => 'rw', ); | |
sub create_container { | |
my $self = shift; | |
my $config = $self->config; | |
my $init_conf = { | |
host_production => { | |
handler => sub { 'www.coolsite.com' }, | |
probe => sub { 1 } | |
}, | |
host_develop => { | |
handler => sub { 'localhost' }, | |
probe => sub { 1 } | |
}, | |
host_full_name => { | |
handler => sub { | |
my $c = shift; | |
# no need checking - if entity absence - all die | |
my $host = $c->get_by_name( 'host_' . $config->{mode} ); | |
return $host; | |
}, | |
probe => sub { 1 } | |
}, | |
debug_level => { | |
handler => sub { | |
die 'original method have huge dependecies'; | |
}, | |
probe => sub { shift } | |
}, | |
system_logger => { | |
handler => sub { | |
my $c = shift; | |
my $loger_engine = do{ | |
given ($config->{logger}){ | |
when ('engine1'){'system_logger1'}; | |
when ('engine2'){'system_logger2'}; | |
} | |
}; | |
my $selected_logger = $c->get_by_name($loger_engine); | |
my $ilogger; | |
eval { | |
$ilogger = $c->get_by_name('ilogger'); | |
$ilogger->engine($selected_logger); | |
}; | |
# we are have simple default resolver | |
$ilogger = $selected_logger if ( ( $config->{logger} eq 'engine1' ) && ! $ilogger); | |
die 'unresolved dependencies [logger] ' unless $ilogger; | |
return $ilogger; | |
}, | |
probe => sub { 1 } | |
}, | |
system_logger1 => { | |
handler => sub { | |
my $c = shift; | |
my $debugger = $c->get_by_name('logger_engine'); | |
my $level = $c->get_by_name('debug_level'); | |
$debugger->set_level($level); | |
return $debugger; | |
}, | |
probe => sub { 1 } | |
}, | |
system_logger2 => { | |
handler => sub { | |
my $c = shift; | |
my $debugger = $c->get_by_name('logger_engine2'); | |
my $level = $c->get_by_name('debug_level'); | |
$debugger->set_level2($level); | |
return $debugger; | |
}, | |
probe => sub { 1 } | |
}, | |
deadly_things => { | |
handler => sub { | |
die 'just died if you touch this'; | |
}, | |
probe => sub { shift } | |
}, | |
}; | |
my $container = Kaiten::Container->new( init => $init_conf ) | |
} | |
#=================================== | |
package LoggerEngine; | |
#=================================== | |
use Moo; | |
has 'level' => ( | |
is => 'rw', | |
writer => 'set_level', | |
default => sub { 0 }, | |
); | |
sub output { | |
my $self = shift; | |
my $message = shift; | |
say( ( $self->level ? 'DEBUG ON: ' : 'DEBUG OFF: ' ) . $message ); | |
} | |
sub self_check { | |
my $self = shift; | |
my $message = shift; | |
say "** CHECK:[$message] **"; | |
} | |
#=================================== | |
package LoggerEngine2; | |
#=================================== | |
use Moo; | |
has 'level2' => ( | |
is => 'rw', | |
writer => 'set_level2', | |
default => sub { 0 }, | |
); | |
sub output2 { | |
my $self = shift; | |
my $message = shift; | |
say( 'logger2 '. ( $self->level2 ? 'DEBUG ON: ' : 'DEBUG OFF: ' ) . $message ); | |
} | |
sub self_check2 { | |
my $self = shift; | |
my $message = shift; | |
say 'logger2 '."** CHECK:[$message] **"; | |
} | |
=pod | |
! WE ARE NOT NEED IT IF WE ARE NOT USE IT | |
#=================================== | |
package ILoggerEngine; | |
#=================================== | |
use Moo; | |
has 'engine' => ( | |
is => 'rw', | |
); | |
sub output { | |
my $self = shift; | |
my $message = shift; | |
my $engine = $self->engine; | |
given (ref $engine){ | |
when('LoggerEngine'){ $engine->output($message) }; | |
when('LoggerEngine2'){ $engine->output2($message) } | |
} | |
} | |
sub self_check { 1 } | |
=cut | |
#=================================== | |
package main; | |
#=================================== | |
my $stable_config = { | |
mode => 'production', | |
logger => 'engine1', | |
}; | |
my $global_constructor = ClobalConstructor->new( config => $stable_config ); | |
my $container = $global_constructor->create_container(); | |
my $logger_engine_conf = { | |
handler => sub { LoggerEngine->new() }, | |
probe => sub { | |
my $self = shift; | |
$self->self_check( 'self-testing at livel [' . $self->level . '] ok' ) | |
}, | |
}; | |
$container->add( 'logger_engine' => $logger_engine_conf ); | |
my $logger_engine2_conf = { | |
handler => sub { LoggerEngine2->new() }, | |
probe => sub { | |
my $self = shift; | |
$self->self_check2( 'self-testing at livel [' . $self->level2 . '] ok' ) | |
}, | |
}; | |
$container->add( 'logger_engine2' => $logger_engine2_conf ); | |
# ok, we are need interface here | |
my $ilogger_conf = { | |
handler => sub { ILoggerEngine->new() }, | |
probe => sub { shift->self_check }, | |
}; | |
$container->add( 'ilogger' => $ilogger_conf ); | |
# ok, its seems little complexly, but this way can used to replace handler with mock | |
my $mock_object = { | |
handler => sub { 1 }, | |
probe => sub { 1 } | |
}; | |
$container->remove('debug_level')->add( 'debug_level' => $mock_object ); | |
my $logger = $container->get_by_name('system_logger'); | |
my $full_name = $container->get_by_name('host_full_name'); | |
$logger->output( 'it is worked at - ' . $full_name ); | |
say 'all ok'; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment