package a::b; use strict; sub a::b { my @l = caller(0); open my $f, "<", $l[1]; my $line; for (0..$l[2] - 1) { $line = <$f>; } my $pack = $l[3]; if (!@_ && $line =~ /$pack\->/) { return $pack; } else { return $pack->new(@_); } } sub new { print "new!!! ".join(", ",@_)."\n"; } sub c { print "a::b->c()!!!! ".join(", ",@_)."\n"; } package main; a::b; a::b('a'); a::b->c; a::b->c('a');