Advertisement
Guest User

Untitled

a guest
Dec 25th, 2016
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 2.26 KB | None | 0 0
  1. use v6;
  2. unit module JK::Logging;
  3.  
  4. role Handler is export {
  5.     method handle(Str:D $entry) { ... }
  6. }
  7.  
  8. class StdoutHandler does Handler is export {
  9.     method handle(Str:D $entry) {
  10.         say $entry;
  11.     }
  12. }
  13.  
  14. enum Severity <debug info warn error>;
  15.  
  16. role LogEntry is export {
  17.     has Str $.message;
  18. }
  19.  
  20. role Formatter[::LogEntryType] is export {
  21.     method format(Severity $severity, LogEntryType:D $entry) returns Str { ... }
  22. }
  23.  
  24. class DefaultFormatter does Formatter[LogEntry] is export {
  25.     method format(Severity $severity, LogEntry:D $entry) returns Str {
  26.         return "$severity.uc(): $entry";
  27.     }
  28. }
  29.  
  30. role Logger[::LogEntryType] is export {
  31.     method debug(LogEntryType:D $entry) { ... }
  32.     method info(LogEntryType:D $entry) { ... }
  33.     method warn(LogEntryType:D $entry) { ... }
  34.     method err(LogEntryType:D $entry) { ... }
  35. }
  36.  
  37.  
  38. role DefaultLogger[LogEntry:U ::LogEntryType] does Logger[LogEntryType] is export {
  39.     has Formatter[LogEntryType] $.formatter is rw;
  40.     has Handler @handlers = StdoutHandler.new();
  41.  
  42.     submethod do-log(Severity $severity, LogEntryType:D $entry) {
  43.         my Str $formatted-entry = $!formatter.format($severity, $entry);
  44.         for @handlers {
  45.             $_.handle($formatted-entry);
  46.         }
  47.     }
  48.  
  49.     method debug(LogEntryType:D $entry) {
  50.         self.do-log(Severity::debug, $entry);
  51.     }
  52.  
  53.     method info(LogEntryType:D $entry) {
  54.         self.do-log(Severity::info, $entry);
  55.     }
  56.  
  57.     method warn(LogEntryType:D $entry) {
  58.         self.do-log(Severity::warn, $entry);
  59.     }
  60.  
  61.     method err(LogEntryType:D $entry) {
  62.         self.do-log(Severity::error, $entry);
  63.     }
  64. }
  65.  
  66. my Logger %logger-registry{LogEntry};
  67. %logger-registry{LogEntry} = DefaultLogger[LogEntry].new(:formatter(DefaultFormatter.new()));
  68.  
  69. sub registerLogger(LogEntry:U ::LogEntryType $logEntryType, Logger[LogEntryType] $logger) is export {
  70.     unless %logger-registry{$logEntryType}:exists {
  71.         %logger-registry{$logEntryType} = $logger;
  72.     }
  73. }
  74.  
  75. sub getLogger(Str $name, LogEntry:U $logEntryType=LogEntry) returns Logger[$logEntryType] is export {
  76.     given %logger-registry{$logEntryType} {
  77.         when $_ { $_.new(); }
  78.         default { die "Cannot get logger for unknown LogEntry type $logEntryType" }
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement