countries defaults managed
[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+$/a;
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 country_modes {
38   my ($self) = @_;
39   return (
40     'CH' => 'Switzerland',
41     'DE' => 'Germany',
42   )
43 }
44
45 sub AUTOLOAD {
46   our $AUTOLOAD;
47
48   my ($self, @args) = @_;
49
50   my $method        =  $AUTOLOAD;
51   $method           =~ s/.*:://;
52   return if $method eq 'DESTROY';
53
54   my $manager = first { $_->can($method) } $self->_managers;
55
56   return $manager ? $manager->$method : @args;
57 }
58
59 1;
60
61 __END__
62
63 =encoding utf-8
64
65 =head1 NAME
66
67 SL::DefaultManager - sets of defaults for use outside of clients
68
69 =head1 SYNOPSIS
70
71   # during startup
72   my $defaults = SL::DefaultManager->new($::lx_office_conf{default_manager});
73
74   # during tests
75   my $defaults = SL::DefaultManager->new('swiss');
76
77   # in consuming code
78   # will return what the manager provides, or the given value if $defaults does
79   # not handle dateformat
80   my $dateformat = $defaults->dateformat('dd.mm.yyyy');
81
82   # have several default managers for different tasks
83   # if polled the first defined response will win
84   my $defaults = SL::DefaultManager->new('swiss', 'mobile', 'point_of_sale');
85
86 =head1 DESCRIPTION
87
88 TODO
89
90 =head1 FUNCTIONS
91
92 TODO
93
94 =head1 BUGS
95
96 None yet :)
97
98 =head1 AUTHOR
99
100 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
101
102 =cut