Documentation and little fixes. This one (0.03) is heading to CPAN
Shawn M Moore [Sun, 16 Dec 2007 19:21:20 +0000 (19:21 +0000)]
ChangeLog [new file with mode: 0644]
README [new file with mode: 0644]
lib/MooseX/Singleton.pm
lib/MooseX/Singleton/Meta/Class.pm
lib/MooseX/Singleton/Meta/Instance.pm
lib/MooseX/Singleton/Object.pm

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..9fe0922
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,11 @@
+Revision history for Perl extension MooseX-Singleton
+
+0.03 2007-12-16
+    - reimplementation as a metaclass (Sartak)
+       - initial CPAN release
+
+0.02 2007-12-16
+    - instance and new are really the same, cleanup (Sartak)
+
+0.01 2007-04-20
+    - initial implementation as a role (Debolaz)
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..76812b7
--- /dev/null
+++ b/README
@@ -0,0 +1,65 @@
+NAME
+    MooseX::Singleton - turn your Moose class into a singleton
+
+VERSION
+    Version 0.03, released 16 Dec 07
+
+SYNOPSIS
+        package MyApp;
+        use MooseX::Singleton;
+
+        has env => (
+            is      => 'rw',
+            isa     => 'HashRef[Str]',
+            default => sub { \%ENV },
+        );
+
+        package main;
+
+        delete MyApp->env->{PATH};
+        my $instance = MyApp->instance;
+        my $same = MyApp->instance;
+
+DESCRIPTION
+    A singleton is a class that has only one instance in an application.
+    "MooseX::Singleton" lets you easily upgrade (or downgrade, as it were)
+    your Moose class to a singleton.
+
+    All you should need to do to transform your class is to change "use
+    Moose" to "use MooseX::Singleton". This module uses a new class
+    metaclass and instance metaclass, so if you're doing metamagic you may
+    not be able to use this.
+
+    "MooseX::Singleton" gives your class an "instance" method that can be
+    used to get a handle on the singleton. It's actually just an alias for
+    "new".
+
+    Alternatively, "YourPackage->method" should just work. This includes
+    accessors.
+
+TODO
+    Always more tests and doc
+    Fix speed boost
+        "instance" invokes "new" every time "Package->method" is called,
+        which incurs a nontrivial runtime cost. I've implemented a
+        short-circuit for this case, which does eliminate nearly all of the
+        runtime cost. However, it's ugly and should be fixed in a more
+        elegant way.
+
+BUGS
+    All complex software has bugs lurking in it, and this module is no
+    exception. If you find a bug please either email me, or add the bug to
+    cpan-RT.
+
+AUTHOR
+    Shawn M Moore <sartak@gmail.com>
+
+SOME CODE STOLEN FROM
+    Anders Nor Berle <debolaz@gmail.com>
+
+COPYRIGHT AND LICENSE
+    Copyright 2007 Shawn M Moore.
+
+    This program is free software; you can redistribute it and/or modify it
+    under the same terms as Perl itself.
+
index c8c4123..5d16bdd 100644 (file)
@@ -3,7 +3,7 @@ use Moose;
 use MooseX::Singleton::Object;
 use MooseX::Singleton::Meta::Class;
 
-our $VERSION = 0.02;
+our $VERSION = 0.03;
 
 sub import {
     my $caller = caller;
@@ -13,8 +13,89 @@ sub import {
     Moose->import({into => $caller});
     strict->import;
     warnings->import;
-
 }
 
 1;
 
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton - turn your Moose class into a singleton
+
+=head1 VERSION
+
+Version 0.03, released 16 Dec 07
+
+=head1 SYNOPSIS
+
+    package MyApp;
+    use MooseX::Singleton;
+
+    has env => (
+        is      => 'rw',
+        isa     => 'HashRef[Str]',
+        default => sub { \%ENV },
+    );
+
+    package main;
+
+    delete MyApp->env->{PATH};
+    my $instance = MyApp->instance;
+    my $same = MyApp->instance;
+
+=head1 DESCRIPTION
+
+A singleton is a class that has only one instance in an application.
+C<MooseX::Singleton> lets you easily upgrade (or downgrade, as it were) your
+L<Moose> class to a singleton.
+
+All you should need to do to transform your class is to change C<use Moose> to
+C<use MooseX::Singleton>. This module uses a new class metaclass and instance
+metaclass, so if you're doing metamagic you may not be able to use this.
+
+C<MooseX::Singleton> gives your class an C<instance> method that can be used to get a handle on the singleton. It's actually just an alias for C<new>.
+
+Alternatively, C<< YourPackage->method >> should just work. This includes
+accessors.
+
+=head1 TODO
+
+=over
+
+=item Always more tests and doc
+
+=item Fix speed boost
+
+C<instance> invokes C<new> every time C<< Package->method >> is called, which
+incurs a nontrivial runtime cost. I've implemented a short-circuit for this
+case, which does eliminate nearly all of the runtime cost. However, it's ugly
+and should be fixed in a more elegant way.
+
+=back
+
+=head1 BUGS
+
+All complex software has bugs lurking in it, and this module is no 
+exception. If you find a bug please either email me, or add the bug
+to cpan-RT.
+
+=head1 AUTHOR
+
+Shawn M Moore E<lt>sartak@gmail.comE<gt>
+
+=head1 SOME CODE STOLEN FROM
+
+Anders Nor Berle E<lt>debolaz@gmail.comE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2007 Shawn M Moore.
+
+This program is free software; you can redistribute it and/or modify it under
+the same terms as Perl itself.
+
+=cut
+
index 51ca11c..28b1437 100644 (file)
@@ -32,3 +32,19 @@ override construct_instance => sub {
 
 1;
 
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton::Meta::Class
+
+=head1 DESCRIPTION
+
+This metaclass is where the forcing of one instance occurs. The first call to
+C<construct_instance> is run normally (and then cached). Subsequent calls will
+return the cached version.
+
+=cut
+
index c0dbc91..ad01ccc 100644 (file)
@@ -56,3 +56,19 @@ sub inline_slot_access {
 
 1;
 
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton::Meta::Instance
+
+=head1 DESCRIPTION
+
+This instance metaclass manages attribute access and storage. When accessing an
+attribute, it will convert a bare package to its cached singleton instance
+(creating it if necessary).
+
+=cut
+
index 08a4926..c35c1e8 100644 (file)
@@ -5,9 +5,21 @@ use metaclass 'MooseX::Singleton::Meta::Class';
 
 extends 'Moose::Object';
 
-no strict 'refs';
-
 sub instance { shift->new }
 
 1;
 
+__END__
+
+=pod
+
+=head1 NAME
+
+MooseX::Singleton::Object - base class for MooseX::Singleton
+
+=head1 DESCRIPTION
+
+This just adds C<instance> as a shortcut for C<new>.
+
+=cut
+