r47605 - in /branches/upstream/libclass-inner-perl/current: Changes Inner.pm MANIFEST META.yml Makefile.PL lib/ lib/Class/ lib/Class/Inner.pm t/basic.t

jawnsy-guest at users.alioth.debian.org jawnsy-guest at users.alioth.debian.org
Sun Nov 22 03:29:37 UTC 2009


Author: jawnsy-guest
Date: Sun Nov 22 03:29:26 2009
New Revision: 47605

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=47605
Log:
[svn-upgrade] Integrating new upstream version, libclass-inner-perl (0.200001)

Added:
    branches/upstream/libclass-inner-perl/current/META.yml
    branches/upstream/libclass-inner-perl/current/lib/
    branches/upstream/libclass-inner-perl/current/lib/Class/
    branches/upstream/libclass-inner-perl/current/lib/Class/Inner.pm
Removed:
    branches/upstream/libclass-inner-perl/current/Inner.pm
Modified:
    branches/upstream/libclass-inner-perl/current/Changes
    branches/upstream/libclass-inner-perl/current/MANIFEST
    branches/upstream/libclass-inner-perl/current/Makefile.PL
    branches/upstream/libclass-inner-perl/current/t/basic.t

Modified: branches/upstream/libclass-inner-perl/current/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/Changes?rev=47605&op=diff
==============================================================================
--- branches/upstream/libclass-inner-perl/current/Changes (original)
+++ branches/upstream/libclass-inner-perl/current/Changes Sun Nov 22 03:29:26 2009
@@ -1,3 +1,11 @@
+2009-11-21
+
+        * Fixed 
+            http://rt.cpan.org/Ticket/Display.html?id=43938
+            http://rt.cpan.org/Ticket/Display.html?id=39140
+            http://rt.cpan.org/Ticket/Display.html?id=33533
+            Which are all really the same issue.
+
 2001-08-12  Piers Cawley  <pdcawley at iterative-software.com>
 
 	* Initial release. Everthing working as documented, I think.  Now

Modified: branches/upstream/libclass-inner-perl/current/MANIFEST
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/MANIFEST?rev=47605&op=diff
==============================================================================
--- branches/upstream/libclass-inner-perl/current/MANIFEST (original)
+++ branches/upstream/libclass-inner-perl/current/MANIFEST Sun Nov 22 03:29:26 2009
@@ -1,6 +1,7 @@
 Changes
-Inner.pm
+lib/Class/Inner.pm
 MANIFEST
 README
 Makefile.PL
 t/basic.t
+META.yml                                 Module meta-data (added by MakeMaker)

Added: branches/upstream/libclass-inner-perl/current/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/META.yml?rev=47605&op=file
==============================================================================
--- branches/upstream/libclass-inner-perl/current/META.yml (added)
+++ branches/upstream/libclass-inner-perl/current/META.yml Sun Nov 22 03:29:26 2009
@@ -1,0 +1,10 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         Class-Inner
+version:      0.200001
+version_from: lib/Class/Inner.pm
+installdirs:  site
+requires:
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.30_01

Modified: branches/upstream/libclass-inner-perl/current/Makefile.PL
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/Makefile.PL?rev=47605&op=diff
==============================================================================
--- branches/upstream/libclass-inner-perl/current/Makefile.PL (original)
+++ branches/upstream/libclass-inner-perl/current/Makefile.PL Sun Nov 22 03:29:26 2009
@@ -3,6 +3,11 @@
 # the contents of the Makefile that is written.
 WriteMakefile(
     'NAME'		=> 'Class::Inner',
-    'VERSION_FROM'	=> 'Inner.pm', # finds $VERSION
+    'VERSION_FROM'	=> 'lib/Class/Inner.pm', # finds $VERSION
     'PREREQ_PM'		=> {}, # e.g., Module::Name => 1.1
+    'META_MERGE'	=> {
+        resources => {
+            repository => 'http://github.com/arunbear/perl5-class-inner',
+        },
+    },
 );

Added: branches/upstream/libclass-inner-perl/current/lib/Class/Inner.pm
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/lib/Class/Inner.pm?rev=47605&op=file
==============================================================================
--- branches/upstream/libclass-inner-perl/current/lib/Class/Inner.pm (added)
+++ branches/upstream/libclass-inner-perl/current/lib/Class/Inner.pm Sun Nov 22 03:29:26 2009
@@ -1,0 +1,197 @@
+package Class::Inner;
+
+use vars qw/$VERSION/;
+
+$VERSION = 0.200_001;
+
+use strict;
+use Carp;
+
+=head1 NAME
+
+Class::Inner - A perlish implementation of Java like inner classes
+
+=head1 SYNOPSIS
+
+    use Class::Inner;
+
+    my $object = Class::Inner->new(
+	parent => 'ParentClass',
+        methods => { method => sub { ... } }, },
+        constructor => 'new',
+        args => [@constructor_args],
+    );
+
+=head1 DESCRIPTION
+
+Yet another implementation of an anonymous class with per object
+overrideable methods, but with the added attraction of sort of working
+dispatch to the parent class's method.
+
+=head2 METHODS
+
+=over 4
+
+=item B<new HASH>
+
+Takes a hash like argument list with the following keys.
+
+=over 4
+
+=item B<parent>
+
+The name of the parent class. Note that you can only get single
+inheritance with this or B<SUPER> won't work.
+
+=item B<methods>
+
+A hash, keys are method names, values are CODEREFs.
+
+=item B<constructor>
+
+The name of the constructor method. Defaults to 'new'.
+
+=item B<args>
+
+An anonymous array of arguments to pass to the constructor. Defaults
+to an empty list.
+
+=back
+
+Returns an object in an 'anonymous' class which inherits from the
+parent class. This anonymous class has a couple of 'extra' methods:
+
+=over 4
+
+=item B<SUPER>
+
+If you were to pass something like
+
+    $obj = Class::Inner->new(
+	parent  => 'Parent',
+	methods => { method =>  sub { ...; $self->SUPER::method(@_) } },
+    );
+
+then C<$self-C<gt>SUPER::method> almost certainly wouldn't do what you expect,
+so we provide the C<SUPER> method which dispatches to the parent 
+implementation of the current method. There seems to be no good way of
+getting the full C<SUPER::> functionality, but I'm working on it.
+
+=item B<DESTROY>
+
+Because B<Class::Inner> works by creating a whole new class name for your
+object, it could potentially leak memory if you create a lot of them. So we
+add a C<DESTROY> method that removes the class from the symbol table once
+it's finished with.
+
+If you need to override a parent's DESTROY method, adding a call to
+C<Class::Inner::clean_symbol_table(ref $self)> to it. Do it at the
+end of the method or your other method calls won't work.
+
+=back
+
+=cut
+
+#'
+
+sub new {
+    my $class	    = shift;
+    my %args	    = ref($_[0]) ? %{$_[0]} : @_;
+    my $parent	    = $args{parent} or
+	croak "Can't work without a parent class\n";
+    my %methods	    = %{$args{methods}||{}};
+    my $constructor = $args{constructor} || 'new';
+    my @constructor_args = @{$args{args} || []};
+
+    my $anon_class = $class->new_classname;
+
+    no strict 'refs';
+
+    @{"$anon_class\::ISA"} = $parent;
+
+    foreach my $methodname (keys %methods) {
+	*{"$anon_class\::$methodname"} = sub {
+	    local $Class::Inner::target_method = $methodname;
+	    $methods{$methodname}->(@_);
+	};
+    }
+
+    # Add the SUPER method.
+
+    unless (exists $methods{SUPER}) {
+	*{"$anon_class\::SUPER"} = sub {
+	    my $self = shift;
+	    my $target_method =
+		join '::', $parent, $Class::Inner::target_method;
+	    $self->$target_method(@_);
+	};
+    }
+
+    unless (exists $methods{DESTROY}) {
+	*{"$anon_class\::DESTROY"} = sub {
+	    my $self = shift;
+	    Class::Inner::clean_symbol_table($anon_class);
+	    bless $self, $parent;
+	}
+    }
+    # Instantiate
+    my $obj = $anon_class->new(@constructor_args);
+}
+
+=item B<clean_symbol_table>
+
+The helper subroutine that DESTROY uses to remove the class from the
+symbol table.
+
+=cut
+
+sub clean_symbol_table {
+    my $class = shift;
+    no strict 'refs';
+    undef %{"${class}::"};	
+}
+
+=item B<new_classname>
+
+Returns a name for the next anonymous class.
+
+=cut
+
+{
+    my $class_counter;
+
+    sub new_classname {
+	my $baseclass = shift;
+	return "$baseclass\::__A" . $class_counter++;
+    }
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Maintained by Arun Prasaad  C<< <arunbear at cpan.org> >>
+
+Copyright (c) 2001 by Piers Cawley E<lt>pdcawley at iterative-software.comE<gt>.
+
+All rights reserved. This program is free software; you can redistribute it
+and/or modify it under the same terms as perl itself.
+
+Thanks to the Iterative Software people: Leon Brocard, Natalie Ford and 
+Dave Cross. Also, this module was written initially for use in the
+PerlUnit project, AKA Test::Unit. Kudos to Christian Lemburg and the rest
+of that team.
+
+=head1 SEE ALSO
+
+There are a million and one differen Class constructors available on CPAN,
+none of them does quite what I want, so I wrote this one to add to
+that population where hopefully it will live and thrive.
+
+=head1 BUGS
+
+Bound to be some. Actually the C<SUPER> method is a workaround for what
+I consider to be a bug in perl.

Modified: branches/upstream/libclass-inner-perl/current/t/basic.t
URL: http://svn.debian.org/wsvn/pkg-perl/branches/upstream/libclass-inner-perl/current/t/basic.t?rev=47605&op=diff
==============================================================================
--- branches/upstream/libclass-inner-perl/current/t/basic.t (original)
+++ branches/upstream/libclass-inner-perl/current/t/basic.t Sun Nov 22 03:29:26 2009
@@ -2,7 +2,7 @@
 
 use strict;
 
-use Test::More qw/no_plan/;
+use Test::More tests => 13;
 
 BEGIN { use_ok( 'Class::Inner' ); }
 
@@ -43,6 +43,8 @@
 
 # Check that destruction works.
 
-$ic = undef;
-
-ok(!$ic_class->isa('Parent'), 'Class dismissed');
+undef $ic;
+{
+    no strict 'refs';
+    is_deeply(\%{"${ic_class}::"}, {}, 'Class dismissed');
+}




More information about the Pkg-perl-cvs-commits mailing list