#.rst:
# FindPerlModules
# ---------------
#
# Check that Perl has certain modules available.
#
# If PERL_EXECUTABLE is set, uses that, otherwise calls the Perl find module.
#
# To use, pass the perl module names (in the form you would use in a Perl
# ``use`` statement) as components.
#
# This will define the following variables:
#
# ``Perl_<module>_FOUND``
#     True if the given Perl module could be loaded by Perl
#
# where ``<module>`` is either the name passed as a component, or a version
# with ``::`` replaced by ``_``.

# Copyright 2015 Alex Merry <alex.merry@kde.org>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. Neither the name of the University nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

if (NOT PERL_EXECUTABLE)
    find_package(Perl)
endif ()

include(FindPackageHandleStandardArgs)

if (PERL_EXECUTABLE)
    set(PerlModules_all_modules_found TRUE)
    foreach (_comp ${PerlModules_FIND_COMPONENTS})
        execute_process(
            COMMAND ${PERL_EXECUTABLE} -e "use ${_comp}"
            RESULT_VARIABLE _result
            OUTPUT_QUIET
            ERROR_QUIET
        )
        string(REPLACE "::" "_" _comp_sanitised "${_comp}")
        if (_result EQUAL 0)
            set(PerlModules_${_comp_sanitised}_FOUND TRUE)
        else ()
            set(PerlModules_${_comp_sanitised}_FOUND FALSE)
            set(PerlModules_all_modules_found FALSE)
        endif ()
        find_package_handle_standard_args(PerlModules_${_comp}
            FOUND_VAR
                PerlModules_${_comp}_FOUND
            REQUIRED_VARS
                PerlModules_${_comp_sanitised}_FOUND
            )
    endforeach ()
endif ()

find_package_handle_standard_args(PerlModules
    FOUND_VAR
        PerlModules_FOUND
    REQUIRED_VARS
        PerlModules_all_modules_found
    HANDLE_COMPONENTS
)

include(FeatureSummary)
set_package_properties(PerlModules PROPERTIES
    URL "http://www.cpan.org"
)
