Index: lang/perl/Class-Null/tags/Class-Null-1.10/LICENSE
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/LICENSE (revision 16311)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/LICENSE (revision 16311)
@@ -0,0 +1,2 @@
+This software is dual-licensed under the Artistic license and the GPL, just
+like Perl itself.
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/00_perl_critic.t
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/00_perl_critic.t (revision 16311)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/00_perl_critic.t (revision 16311)
@@ -0,0 +1,27 @@
+#!perl -w
+
+use strict;
+use warnings;
+
+use FindBin '$Bin';
+use File::Spec;
+use UNIVERSAL::require;
+use Test::More;
+
+plan skip_all =>
+    'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'
+    unless $ENV{TEST_AUTHOR};
+
+my %opt;
+my $rc_file = File::Spec->catfile($Bin, 'perlcriticrc');
+$opt{'-profile'} = $rc_file if -r $rc_file;
+
+if (Perl::Critic->require('1.078') &&
+    Test::Perl::Critic->require &&
+    Test::Perl::Critic->import(%opt)) {
+
+    all_critic_ok("lib");
+} else {
+    plan skip_all => $@;
+}
+    
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/00_pod.t
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/00_pod.t (revision 16311)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/00_pod.t (revision 16311)
@@ -0,0 +1,10 @@
+#!perl -w
+
+use strict;
+use warnings;
+
+use Test::More;
+eval "use Test::Pod";
+plan skip_all => "Test::Pod required for testing POD" if $@;
+all_pod_files_ok();
+    
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/02_new_new.t
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/02_new_new.t (revision 22941)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/02_new_new.t (revision 22941)
@@ -0,0 +1,7 @@
+use strict;
+use warnings;
+use Test::More tests => 1;
+use Class::Null;
+
+my $o = Class::Null->new->new;
+isa_ok($o, 'Class::Null');
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/perlcriticrc
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/perlcriticrc (revision 9747)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/perlcriticrc (revision 9747)
@@ -0,0 +1,12 @@
+# no strict 'refs'
+[TestingAndDebugging::ProhibitNoStrict]
+allow = refs
+
+[-BuiltinFunctions::ProhibitStringyEval]
+[-ControlStructures::ProhibitMutatingListFunctions]
+[-Subroutines::ProhibitExplicitReturnUndef]
+[-Subroutines::ProhibitSubroutinePrototypes]
+[-Variables::ProhibitConditionalDeclarations]
+
+# for mkdir $dir, 0777
+[-ValuesAndExpressions::ProhibitLeadingZeros]
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/00_compile.t
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/00_compile.t (revision 16311)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/00_compile.t (revision 16311)
@@ -0,0 +1,13 @@
+#!perl -w
+
+use strict;
+use warnings;
+
+BEGIN {
+    use Test::More;
+    eval "use Test::Compile";
+    Test::More->builder->BAIL_OUT(
+        "Test::Compile required for testing compilation") if $@;
+    all_pm_files_ok();
+}
+    
Index: lang/perl/Class-Null/tags/Class-Null-1.10/t/01_misc.t
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/t/01_misc.t (revision 22940)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/t/01_misc.t (revision 22940)
@@ -0,0 +1,48 @@
+use strict;
+use warnings;
+use Test::More tests => 95;
+use Class::Null;
+
+for my $o (Class::Null->new, Class::Null::SubClass->new) {
+    isa_ok($o, 'Class::Null');
+    my @l = ('A'..'Z', 'a'..'z', '_');
+
+    for (1..10) {
+        my $method = join '' => map { $l[rand@l] } 1..10;
+        ok(do { $o->$method, 1 }, "can $method()");
+    }
+
+    for (1..10) {
+        my $method = join '' => map { $l[rand@l] } 1..10;
+        is($o->$method, Class::Null->new,
+           "$method() returns a Class::Null object");
+
+        # Now it will have installed the method via *{$AUTOLOAD}. Check
+        # it's still ok.
+
+        is($o->$method, Class::Null->new,
+           "$method() returns a Class::Null object");
+
+        is($o->$method->$method, Class::Null->new,
+           "$method() method chaining ok");
+    }
+
+    is($o+5, 5, 'adding null object 1');
+    is(3+$o, 3, 'adding null object 2');
+    is(-$o-7, -7, 'subtracting null object');
+    is("<<<$o>>>", '<<<>>>', 'stringifying null object');
+    is($o ? 'yes' : 'no', 'no', 'string object in boolean context');
+
+    my $o_clone;
+    eval { $o_clone = $o->new };
+    isa_ok($o_clone, 'Class::Null', 'Result of Class::Null->new->new');
+}
+
+isa_ok(Class::Null::whatever(), 'Class::Null', 'Regular function call');
+
+
+
+package Class::Null::SubClass;
+use base 'Class::Null';
+1;
+
Index: lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST (revision 22941)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST (revision 22941)
@@ -0,0 +1,26 @@
+Changes
+inc/Module/AutoInstall.pm
+inc/Module/Install.pm
+inc/Module/Install/AutoInstall.pm
+inc/Module/Install/Base.pm
+inc/Module/Install/Can.pm
+inc/Module/Install/Fetch.pm
+inc/Module/Install/Include.pm
+inc/Module/Install/Makefile.pm
+inc/Module/Install/Metadata.pm
+inc/Module/Install/Win32.pm
+inc/Module/Install/WriteAll.pm
+inc/Test/Compile.pm
+inc/Test/More.pm
+lib/Class/Null.pm
+LICENSE
+Makefile.PL
+MANIFEST			This list of files
+META.yml
+README
+t/00_compile.t
+t/00_perl_critic.t
+t/00_pod.t
+t/01_misc.t
+t/02_new_new.t
+t/perlcriticrc
Index: lang/perl/Class-Null/tags/Class-Null-1.10/lib/Class/Null.pm
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/lib/Class/Null.pm (revision 22940)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/lib/Class/Null.pm (revision 22940)
@@ -0,0 +1,225 @@
+package Class::Null;
+
+use warnings;
+use strict;
+
+our $VERSION = '1.10';
+
+use overload
+    'bool'   => sub { 0 },
+    '""'     => sub { '' },
+    '0+'     => sub { 0 },
+    fallback => 1;
+
+sub new {
+    # the following simple line doesn't work... :(
+    # our $singleton ||= bless {}, shift
+
+    our $singleton;
+    return $singleton if defined $singleton;
+    $singleton = bless {}, shift
+}
+
+sub AUTOLOAD { our $singleton }
+
+
+1;
+
+__END__
+
+
+
+=head1 NAME
+
+Class::Null - Implements the Null Class design pattern
+
+=head1 SYNOPSIS
+
+  use Class::Null;
+
+  # some class constructor and accessor declaration here
+
+  sub init {
+    my $self = shift;
+    ...
+    $self->log(Class::Null->new);
+    ...
+  }
+
+  sub do_it {
+    my $self = shift;
+    $self->log->log(level => 'debug', message => 'starting to do it');
+    ...
+    $self->log->log(level => 'debug', message => 'still doing it');
+    ...
+    $self->log->log(level => 'debug', message => 'finished doing it');
+  }
+
+=head1 DESCRIPTION
+
+This class implements the Null Class design pattern.
+
+Suppose that methods in your object want to write log messages to a log
+object. The log object is possibly stored in a slot in your object and
+can be accessed using an accessor method:
+
+  package MyObject;
+
+  use base 'Class::Accessor';
+  __PACKAGE__->mk_accessors(qw(log));
+
+  sub do_it {
+    my $self = shift;
+    $self->log->log(level => 'debug', message => 'starting to do it');
+    ...
+    $self->log->log(level => 'debug', message => 'still doing it');
+    ...
+    $self->log->log(level => 'debug', message => 'finished doing it');
+  }
+
+The log object simply needs to have a C<log()> method that accepts
+two named parameters. Any class defining such a method will do, and
+C<Log::Dispatch> fulfils that requirement while providing a lot of
+flexibility and reusability in handling the logged messages.
+
+You might want to log messages to a file:
+
+  use Log::Dispatch;
+
+  my $dispatcher = Log::Dispatch->new;
+
+  $dispatcher->add(Log::Dispatch::File->new(
+    name      => 'file1',
+    min_level => 'debug',
+    filename  => 'logfile'));
+
+  my $obj = MyObject->new(log => $dispatcher);
+  $obj->do_it;
+
+But what happens if we don't define a log object? Your object's methods
+would have to check whether a log object is defined before calling the
+C<log()> method. This leads to lots of unwieldy code like
+
+  sub do_it {
+    my $self = shift;
+    if (defined (my $log = $self->log)) {
+      $log->log(level => 'debug', message => 'starting to do it');
+    }
+    ...
+    if (defined (my $log = $self->log)) {
+      $log->log(level => 'debug', message => 'still doing it');
+    }
+    ...
+    if (defined (my $log = $self->log)) {
+      $log->log(level => 'debug', message => 'finished doing it');
+    }
+  }
+
+The proliferation of if-statements really distracts from the actual call
+to C<log()> and also distracts from the rest of the method code. There
+is a better way. We can ensure that there is always a log object that we can
+call C<log()> on, even if it doesn't do very much (or in fact, anything at
+all).
+
+This object with null functionality is what is called a null object. We can
+create the object the usual way, using the C<new()> constructor, and call any
+method on it, and all methods will do the same - nothing. (Actually, it
+always returns the same C<Class::Null> singleton object, enabling method
+chaining.) It's effectively a catch-all object. We can use this class with our
+own object like this:
+
+  package MyObject;
+
+  use Class::Null;
+
+  # some class constructor and accessor declaration here
+
+  sub init {
+    my $self = shift;
+    ...
+    $self->log(Class::Null->new);
+    ...
+  }
+
+  sub do_it {
+    my $self = shift;
+    $self->log->log(level => 'debug', message => 'starting to do it');
+    ...
+    $self->log->log(level => 'debug', message => 'still doing it');
+    ...
+    $self->log->log(level => 'debug', message => 'finished doing it');
+  }
+
+This is only one example of using a null class, but it can be used whenever
+you want to make an optional helper object into a mandatory helper object,
+thereby avoiding unnecessarily complicated checks and preserving the
+transparency of how your objects are related to each other and how they
+call each other.
+
+Although C<Class::Null> is exceedingly simple it has been made into a
+distribution and put on CPAN to avoid further clutter and repetitive
+definitions.
+
+=head1 METHODS
+
+=over 4
+
+=item new()
+
+Returns the singleton null object.
+
+=item any other method
+
+Returns another singleton null object so method chaining works.
+
+=back
+
+=head1 OVERLOADS
+
+=over 4
+
+=item Boolean context
+
+In boolean context, a null object always evaluates to false.
+
+=item Numeric context
+
+When used as a number, a null object always evaluates to 0.
+
+=item String context
+
+When stringified, a null object always evaluates to the empty string.
+
+=back
+
+=head1 BUGS AND LIMITATIONS
+
+No bugs have been reported.
+
+Please report any bugs or feature requests through the web interface at
+L<http://rt.cpan.org>.
+
+=head1 INSTALLATION
+
+See perlmodinstall for information and options on installing Perl modules.
+
+=head1 AVAILABILITY
+
+The latest version of this module is available from the Comprehensive Perl
+Archive Network (CPAN). Visit <http://www.perl.com/CPAN/> to find a CPAN
+site near you. Or see <http://www.perl.com/CPAN/authors/id/M/MA/MARCEL/>.
+
+=head1 AUTHORS
+
+Marcel GrE<uuml>nauer, C<< <marcel@cpan.org> >>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2005-2008 by the authors.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+
+=cut
+
Index: lang/perl/Class-Null/tags/Class-Null-1.10/Makefile.PL
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/Makefile.PL (revision 16446)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/Makefile.PL (revision 16446)
@@ -0,0 +1,16 @@
+use inc::Module::Install;
+include 'Module::AutoInstall';
+
+name 'Class-Null';
+all_from 'lib/Class/Null.pm';
+perl_version '5.006';
+
+recommends 'Test::Pod';
+recommends 'Test::Pod::Coverage';
+
+test_requires 'Test::More' => '0.70';
+test_requires 'Test::Compile';
+
+auto_install;
+auto_include;
+WriteAll;
Index: lang/perl/Class-Null/tags/Class-Null-1.10/Changes
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/Changes (revision 22940)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/Changes (revision 22940)
@@ -0,0 +1,60 @@
+Revision history for Perl extension Class-Null
+
+1.10  Fri Nov  7 11:43:47 CET 2008 (Marcel Gruenauer <marcel@cpan.org>)
+     - Changed dist style and Changes back to standard. People didn't like it -
+       the nail that sticks out gets hammered down.
+     - Added standard test files; this will also help with CPANTS.
+     - Fixed a bug where Class::Null->new->new didn't work (thanks rabbit,
+       rt.cpan.org bug #34244)
+
+1.09  Thu, 29 May 2008 12:01:38 -0000 (Marcel Gruenauer <marcel@cpan.org>)
+     - Converted Changes file to YAML style
+     - .shipit: added Twitter step
+     - Makefile.PL: added auto_install() and process_templates()
+     - lib/*: converted to template
+     - updated MANIFEST
+     - added t/perlcriticrc
+     - updated MANIFEST
+     - .shipit: fixed svk.tagpattern
+     - tags: NEWFEATURE
+
+1.08  Sat, 20 Oct 2007 22:19:07 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - simplified accessor declaration in documentation
+
+1.07  Thu, 18 Oct 2007 10:09:39 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - fixed version requirement of Test::More
+
+1.06  Sun, 23 Sep 2007 10:03:20 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - now uses Module::Install::StandardTests
+
+1.05  Sat, 08 Sep 2007 09:38:55 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - fixed the documentation
+     - use warnings; use strict;
+     - converted to new-style distro (with Module::Install and such)
+
+1.04  Wed, 11 Jan 2006 15:44:53 +0100 (Marcel Gruenauer <marcel@cpan.org>)
+     - Consistency improvements
+
+1.03  Wed, 09 Feb 2005 15:26:03 +0100 (Marcel Gruenauer <marcel@cpan.org>)
+     - Removed Test::Distribution requirement
+     - Added method chaining
+
+1.02  Fri, 06 Sep 2002 18:58:47 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - changed AUTOLOAD to return undef. Up to now it returned the glob created
+       by *{$AUTOLOAD}, which is not what the called would expect from sub {}.
+
+1.01  Sun, 18 Aug 2002 13:52:05 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - Class::Null is now a singleton to reduce memory overhead (thanks
+       nwetters)
+     - Class::Null now creates an empty subroutine when autoloading, to
+       increase the speed of subsequent calls (they don't have to go through
+       AUTOLOAD again) (thanks nwetters)
+
+1.00  Sat, 17 Aug 2002 11:38:47 +0200 (Marcel Gruenauer <marcel@cpan.org>)
+     - changed 'our' to 'use vars' for $VERSION so it runs under earlier
+       versions of perl (thanks richardc)
+     - fixed a POD typo
+     - removed the '5.008' requirement from Makefile.PL
+
+0.01  Fri, 16 Aug 2002 17:01:00 +0100 (Marcel Gruenauer <marcel@cpan.org>)
+     - original version
Index: lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST.SKIP
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST.SKIP (revision 16446)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/MANIFEST.SKIP (revision 16446)
@@ -0,0 +1,39 @@
+# Version control files and dirs.
+\bRCS\b
+\bCVS\b
+.svn
+,v$
+
+# Makemaker/Build.PL generated files and dirs.
+^MANIFEST\.
+^Makefile$
+^Build$
+^blib/
+^pm_to_blib/
+^_build/
+^MakeMaker-\d
+embedded/
+cover_db/
+smoke.html
+smoke.yaml
+smoketee.txt
+sqlnet.log
+BUILD.SKIP
+COVER.SKIP
+CPAN.SKIP
+t/000_standard__*
+
+# Temp, old, emacs, vim, backup files.
+~$
+\.old$
+\.swp$
+\.tar$
+\.tar\.gz$
+^#.*#$
+^\.#
+.shipit
+
+# Local files, not to be included
+^scratch/
+core
+^var/
Index: lang/perl/Class-Null/tags/Class-Null-1.10/README
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/README (revision 9747)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/README (revision 9747)
@@ -0,0 +1,27 @@
+This is the Perl module Class::Null.
+
+INSTALLATION
+
+Class::Null installation is straightforward. If your CPAN shell is set up,
+you should just be able to do
+
+    % cpan Class::Null
+
+Download it, unpack it, then build it as per the usual:
+
+    % perl Makefile.PL
+    % make && make test
+
+Then install it:
+
+    % make install
+
+DOCUMENTATION
+
+Class::Null documentation is available as in POD. So you can do:
+
+    % perldoc Class::Null
+
+to read the documentation online with your favorite pager.
+
+Marcel Gruenauer
Index: lang/perl/Class-Null/tags/Class-Null-1.10/.shipit
===================================================================
--- lang/perl/Class-Null/tags/Class-Null-1.10/.shipit (revision 16311)
+++ lang/perl/Class-Null/tags/Class-Null-1.10/.shipit (revision 16311)
@@ -0,0 +1,8 @@
+steps = FindVersion, ChangeVersion, CheckChangeLog, Manifest, DistTest, Commit, Tag, MakeDist, MyUploadCPAN, DistClean, Twitter
+
+svn.tagpattern = http://svn.coderepos.org/share/lang/perl/Class-Null/tags/Class-Null-%v
+
+twitter.config = ~/.twitterrc
+twitter.distname = Class-Null
+twitter.message = shipped %d %v - soon at %u
+
