Advertisement
Guest User

Untitled

a guest
Dec 26th, 2016
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 6 1.87 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[LogEntry:U ::LogEntryType] is export {
  21.     method format(Severity $severity, LogEntryType:D $entry) returns Str {
  22.         return "$severity.uc(): $entry";
  23.     }
  24. }
  25.  
  26. role Logger[LogEntry:U ::LogEntryType] is export {
  27.     has Formatter[LogEntryType] $formatter;
  28.     has Handler @handlers = StdoutHandler.new();
  29.  
  30.     submethod do-log(Severity $severity, LogEntryType:D $entry) {
  31.         my Str $formatted-entry = $!formatter.format($severity, $entry);
  32.         for @!handlers {
  33.             $_.handle($formatted-entry);
  34.         }
  35.     }
  36.  
  37.     method debug(LogEntryType:D $entry) {
  38.         self.do-log(Severity::debug, $entry);
  39.     }
  40.  
  41.     method info(LogEntryType:D $entry) {
  42.         self.do-log(Severity::info, $entry);
  43.     }
  44.  
  45.     method warn(LogEntryType:D $entry) {
  46.         self.do-log(Severity::warn, $entry);
  47.     }
  48.  
  49.     method err(LogEntryType:D $entry) {
  50.         self.do-log(Severity::error, $entry);
  51.     }
  52. }
  53.  
  54. class DefaultLogger does Logger[LogEntry] {
  55.  
  56. }
  57.  
  58. my Logger %logger-registry{LogEntry};
  59. %logger-registry{LogEntry} = DefaultLogger.new();
  60.  
  61. sub registerLogger(LogEntry:U ::LogEntryType $logEntryType, Logger[LogEntryType] $logger) is export {
  62.     unless %logger-registry{$logEntryType}:exists {
  63.         %logger-registry{$logEntryType} = $logger;
  64.     }
  65. }
  66.  
  67. sub getLogger(Str $name, LogEntry:U $logEntryType=LogEntry) returns Logger[$logEntryType] is export {
  68.     given %logger-registry{$logEntryType} {
  69.         when $_ { $_.new(); }
  70.         default { die "Cannot get logger for unknown LogEntry type $logEntryType" }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement