# NAME

Module::Filename - Provides an object oriented, cross platform interface for getting a module's filename

# SYNOPSIS

    use Module::Filename;
    my $filename=Module::Filename->new->filename("Test::More"); #isa Path::Class::File

    use Module::Filename qw{module_filename};
    my $filename=module_filename("Test::More");                 #isa Path::Class::File

# DESCRIPTION

This module returns the filename as a [Path::Class::File](https://metacpan.org/pod/Path%3A%3AClass%3A%3AFile) object.  It does not load any packages as it scans.  It simply scans @INC looking for a module of the same name as the package passed.

# USAGE

    use Module::Filename;
    my $filename=Module::Filename->new->filename("Test::More"); #isa Path::Class::File
    print "Test::More can be found at $filename\n";

# CONSTRUCTOR

## new

    my $mf=Module::Filename->new();

# METHODS

## initialize

You can inherit the filename method in your package.

    use base qw{Module::Filename};
    sub initialize{do_something_else()};

## filename

Returns a [Path::Class::File](https://metacpan.org/pod/Path%3A%3AClass%3A%3AFile) object for the first filename that matches the module in the @INC path array.

    my $filename=Module::Filename->new->filename("Test::More"); #isa Path::Class::File
    print "Filename: $filename\n";

# FUNCTIONS

## module\_filename

Returns a [Path::Class::File](https://metacpan.org/pod/Path%3A%3AClass%3A%3AFile) object for the first filename that matches the module in the @INC path array.

    my $filname=module_filename("Test::More"); #isa Path::Class::File
    print "Filename: $filename\n";

# LIMITATIONS

The algorithm does not scan inside module files for provided packages.

# BUGS

Submit to RT and email author.

# AUTHOR

    Michael R. Davis

# COPYRIGHT

This program is free software licensed under the...

    The BSD License

The full text of the license can be found in the LICENSE file included with this module.

# SEE ALSO

Module::Filename predates [Module::Path](https://metacpan.org/pod/Module%3A%3APath) by almost 4 years but it appears more people prefer [Module::Path](https://metacpan.org/pod/Module%3A%3APath) over Module::Filename as it does not have the dependency on [Path::Class](https://metacpan.org/pod/Path%3A%3AClass).  After the reviews on [http://neilb.org/reviews/module-path.html](http://neilb.org/reviews/module-path.html). I added the functional API to Module::Filename.  So, your decision is simply an object/non-object decision.   The operations with the file system that both packages perform outweigh the performance of the object creation in Module::Filename.  So, any performance penalty should not be measurable.  Since Module::Filename does not need three extra file test operations that Module::Path 0.18 performs on each @INC directory, Module::Filename may actually be faster than [Module::Path](https://metacpan.org/pod/Module%3A%3APath) for most applications.

## Similar Capabilities

[Module::Path](https://metacpan.org/pod/Module%3A%3APath), [perlvar](https://metacpan.org/pod/perlvar) %INC, [pmpath](https://metacpan.org/pod/pmpath), [Module::Info](https://metacpan.org/pod/Module%3A%3AInfo) constructor=>new\_from\_module, method=>file, [Module::InstalledVersion](https://metacpan.org/pod/Module%3A%3AInstalledVersion) property=>"dir", [Module::Locate](https://metacpan.org/pod/Module%3A%3ALocate) method=>locate, [Module::Util](https://metacpan.org/pod/Module%3A%3AUtil) method=>find\_installed, ["module\_notional\_filename" in Module::Runtime](https://metacpan.org/pod/Module%3A%3ARuntime#module_notional_filename)

## Comparison

CPAN modules for getting a module's path [http://neilb.org/reviews/module-path.html](http://neilb.org/reviews/module-path.html)