in reply to Methods supporting both package and OOP style calls

  1. Try runningthe code you have. MyPackage->foo('stuff'); isn't going to do what you think it will
  2. You should take a look at perlboot, perltoot, perltootc, perlobj, and perlbot. In particular grep perlboot for "Making a method work with either classes or instances"
  3. If you want a method to work in all three of the following cases...

    my $foo = new MyPackage(); $foo->foo('test1'); MyPackage->foo('test2'); MyPackage::foo('test3'); # not handled by the case above

    ...it's a little trickier, because in the second case "MyPackage" is just passed as a scalar. I believe the only ways to distinguish between the second and third situations are:

    • Expect something that isn't a 'string', and if the first arg is a 'string' ignore it.
    • Expect a parameter list of a specific length N, and if the list has N+1, ignore the first.