]> git.vpit.fr Git - perl/modules/rgit.git/commitdiff
Improve the class delegation mechanism in App::Rgit::Command, and test it
authorVincent Pit <vince@profvince.com>
Sun, 5 Oct 2008 21:44:11 +0000 (23:44 +0200)
committerVincent Pit <vince@profvince.com>
Sun, 5 Oct 2008 21:44:11 +0000 (23:44 +0200)
lib/App/Rgit/Command.pm
t/15-failures.t

index ce7bac636286209211361447e730dd3306fc045e..3754d83363bfc3af04a5e703f456c700e3f92ba5 100644 (file)
@@ -44,12 +44,16 @@ sub new {
  my $cmd = $args{cmd};
  $cmd = ' ' unless defined $cmd;
  my $action = $class->action($cmd);
- croak "Command $cmd shouldn't be executed as an $action"
-                           unless $class eq __PACKAGE__ or $class->isa($action);
+ if ($class eq __PACKAGE__) {
+  $class = $action;
+ } else {
+  croak "Command $cmd should be executed as a $action"
+                               unless $class->isa($action);
+ }
  eval "require $action; 1" or croak "Couldn't load $action: $@";
  my $r = App::Rgit::Repository->new(fake => 1);
  return unless defined $r;
- $action->SUPER::new(
+ $class->SUPER::new(
   cmd         => $cmd,
   args        => $args{args} || [ ],
   repos       => $args{repos},
index 6b823fe9dc5ae425f816b77d1c19c21b59d43a39..52332672c5da3d15f50f03f4488c37470b5d3fa0 100644 (file)
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 17;
+use Test::More tests => 20;
 
 use App::Rgit;
 
@@ -43,3 +43,16 @@ isa_ok($res, 'App::Rgit', '$ar->new(): no args: returns an object');
 $res = eval { App::Rgit::new(undef, root => 't/repos', git => 't/bin/git', cmd => 'version'); };
 is($@,       '',         'undef->App::Rgit::new(): no args: does not croak');
 isa_ok($res, 'App::Rgit','undef->App::Rgit::new(): no args: returns an object');
+
+use App::Rgit::Command;
+
+eval { App::Rgit::Command::Once->App::Rgit::Command::new(cmd => 'dongs') };
+like($@, qr!Command\s+dongs\s+should\s+be\s+executed\s+as\s+a\s+App::Rgit::Command::Each!, 'App::Rgit::Command::Once->App::Rgit::Command::new(cmd => "dongs"): croaks');
+
+{
+ no strict 'refs';
+ push @{'App::Rgit::Test::Foo::ISA'}, 'App::Rgit::Command::Once';
+}
+$res = eval { App::Rgit::Test::Foo->App::Rgit::Command::new(cmd => 'version') };
+is($@, '', 'App::Rgit::Test::Foo->App::Rgit::Command::new(cmd => "version"): does not croak');
+isa_ok($res, 'App::Rgit::Test::Foo', 'App::Rgit::Test::Foo->App::Rgit::Command::new(cmd => "version"): returns valid object');