dzilize this distro
[gitmo/MooseX-Singleton.git] / lib / MooseX / Singleton / Role / Meta / Class.pm
CommitLineData
8eec3c69 1package MooseX::Singleton::Role::Meta::Class;
2use Moose::Role;
a4e5ec1e 3use MooseX::Singleton::Role::Meta::Instance;
4use MooseX::Singleton::Role::Meta::Method::Constructor;
5a0f3fa6 5
109b110b 6
1de95613 7sub existing_singleton {
3822ace2 8 my ($class) = @_;
9 my $pkg = $class->name;
10
11 no strict 'refs';
12
13 # create exactly one instance
4c256923 14 if ( defined ${"$pkg\::singleton"} ) {
1de95613 15 return ${"$pkg\::singleton"};
3822ace2 16 }
17
1de95613 18 return;
19}
20
03e1b8df 21sub clear_singleton {
22 my ($class) = @_;
23 my $pkg = $class->name;
24 no strict 'refs';
25 undef ${"$pkg\::singleton"};
26}
27
0cd38a85 28override _construct_instance => sub {
1de95613 29 my ($class) = @_;
30
31 # create exactly one instance
32 my $existing = $class->existing_singleton;
33 return $existing if $existing;
34
35 my $pkg = $class->name;
36 no strict 'refs';
37 return ${"$pkg\::singleton"} = super;
3822ace2 38};
39
837c9793 40if ( $Moose::VERSION >= 1.9900 ) {
41 override _inline_params => sub {
42 my $self = shift;
43
44 return
45 'my $existing = do {',
46 'no strict "refs";',
47 'no warnings "once";',
48 '\${"$class\::singleton"};',
49 '};',
50 'return ${$existing} if ${$existing};',
51 super();
52 };
53
54 override _inline_extra_init => sub {
55 my $self = shift;
56
57 return '${$existing} = $instance;';
58 };
59}
60
2cb90d53 61no Moose::Role;
2b4ce4bd 62
109b110b 631;
64
4e4f795a 65# ABSTRACT: Metaclass role for MooseX::Singleton
66
b375b147 67__END__
68
69=pod
70
b375b147 71=head1 DESCRIPTION
72
8eec3c69 73This metaclass role makes sure that there is only ever one instance of an
74object for a singleton class. The first call to C<construct_instance> is run
75normally (and then cached). Subsequent calls will return the cached version.
b375b147 76
77=cut
78