#!/afs/athena/contrib/perl5/perl -w

use strict;

package Moo;

use strict;
use Carp;

sub gack { print "Gack! [@_]\n"; 1; }
sub foo {
  my ($S) = @_;
  ($S =~ s/::(?=[^:]+$)/::g/) || ($S = "g$S");
  if (defined &$S) {
    eval "$S('$S')";
  } else {
    print "no $S\n";
  }
}

     foo('ack');       foo('xxx');
Moo::foo('ack');  Moo::foo('xxx');

package main;

Moo::foo('ack');        Moo::foo('xxx');
Moo::foo('Moo::ack');   Moo::foo('Moo::xxx');
Moo::foo('main::ack');  Moo::foo('main::xxx');
