epic-s6ts
[kivitendo-erp.git] / SL / DefaultManager.pm
1 package SL::DefaultManager;
2
3 use strict;
4
5 use SL::Util qw(camelify);
6 use List::Util qw(first);
7
8 my %manager_cache;
9
10 sub new {
11   my ($class, @defaults) = @_;
12   bless [ @defaults ], $class;
13 }
14
15 sub _managers {
16   my ($self) = @_;
17
18   map { $self->_get($_) } @$self;
19 }
20
21 sub _get {
22   my ($class, $name) = @_;
23
24   return if !$name;
25
26   $manager_cache{$name} ||= do {
27     die "'$name' doesn't look like a default manager." unless $name =~ /^\w+$/;
28
29     my $package = 'SL::DefaultManager::' . camelify($name);
30
31     eval "require $package; 1" or die "could not load default manager '$package': $@";
32
33     $package->new;
34   }
35 }
36
37 sub AUTOLOAD {
38   our $AUTOLOAD;
39
40   my ($self, @args) = @_;
41
42   my $method        =  $AUTOLOAD;
43   $method           =~ s/.*:://;
44   return if $method eq 'DESTROY';
45
46   my $manager = first { $_->can($method) } $self->_managers;
47
48   return $manager ? $manager->$method : @args;
49 }
50
51 1;
52
53 __END__
54
55 =encoding utf-8
56
57 =head1 NAME
58
59 SL::DefaultManager - sets of defaults for use outside of clients
60
61 =head1 SYNOPSIS
62
63   # during startup
64   my $defaults = SL::DefaultManager->new($::lx_office_conf{default_manager});
65
66   # during tests
67   my $defaults = SL::DefaultManager->new('swiss');
68
69   # in consuming code
70   # will return what the manager provides, or the given value if $defaults does
71   # not handle dateformat
72   my $dateformat = $defaults->dateformat('dd.mm.yyyy');
73
74   # have several default managers for different tasks
75   # if polled the first defined response will win
76   my $defaults = SL::DefaultManager->new('swiss', 'mobile', 'point_of_sale');
77
78 =head1 DESCRIPTION
79
80 TODO
81
82 =head1 FUNCTIONS
83
84 TODO
85
86 =head1 BUGS
87
88 None yet :)
89
90 =head1 AUTHOR
91
92 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
93
94 =cut