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