http://www.perlmonks.org?node_id=478160


in reply to Function Identification.

Subroutine calls will be inherited differently depending on whether you're calling them as functions, or as object methods. We can test this with two different modules:
package Foo; use base 'Exporter'; @EXPORT = "func"; sub func { return "Foo" }
package Bar; use base 'Exporter'; @EXPORT = "func"; sub func { return "Bar" }

Exporter overwrites the current package's symbol table entry for func() when you use a module. So, as holli has pointed out, if two seperate modules export the same function, the most recent one will be the one that is called: when you use Foo, func() is created locally as a reference to Foo::func(), and then when Bar is imported it replaces the existing reference with one to Bar::func():
[matt@blue 478146] cat func.pl package func; use Foo; use Bar; print func(); [matt@blue 478146] perl -l func.pl Bar

OO Perl's inheritance chain works differently - it's done at run-time, left-to-right, depth first (left-to-right is referring to the contents of @ISA). So, if you're using OO modules, you will get the opposite result - a call to func() will go to the *first* module Perl finds, that provides the requested method (function):
[matt@blue 478146] cat meth.pl package meth; use base 'Foo'; use base 'Bar'; sub new { bless {}, __PACKAGE__ } $o = new meth; print $o->func; [matt@blue 478146] perl -l meth.pl Foo