NAME

   Scalar::Classify - get type and class information for scalars

SYNOPSIS

      use Scalar::Classify qw( classify classify_pair );

      # determine the type (e.g. HASH for a hashref) and the object class (if any)
      my ( $type, $class ) = classify( $some_scalar );


     # warn if two args differ, supply default if one is undef
     my $default_value =
       classify_pair( $arg1, $arg2 );

     # Also get type and class; error out if two args differ
     my ( $default_value, $type, $class ) =
       classify_pair( $arg1, $arg2, { mismatch_policy => 'error' });

     # If a given ref was undef, replace it with a default value
     classify_pair( $arg1, $arg2, { also_qualify => 1 });

DESCRIPTION

   Scalar::Classify provides a routine named "classify" that can be used
   to examine a given argument to determine it's type and class (if any).

   Here "type" means either the return from reftype (, or if it's a
   scalar, a code indicating whether it's a string or a number, and
   "class" it the object class, the way a reference has been blessed.

   This module also provides the routine "classify_pair", which looks at a
   pair of variables intended to be of the same type, and if at least one
   of them is defined, uses that to get an appropriate default value for
   that type.

MOTIVATION

   Perl contains a built-in "ref" function, and has some useful routines
   in the standard Scalar::Util library ('ref', 'looks_like_number') which
   can be used to examine the type of an argument. The classify routine
   provided here internally uses all three of these, returning a
   two-values that describe the kind of thing you're examining.

   The immediate goal was to provide support routines for the Data::Math
   project.

EXPORT

   None by default. Optionally:

   classify

     Example usage:

        my ( $type, $class ) = classify( $some_var );

     Returns two pieces of information, the underlying "type", and the
     "class" (if this is a reference blessed into a class).

     The type is most often (but not limited to) one of the following:

        ARRAY
        HASH
        :NUMBER:
        :STRING:

     Other possibilities are the other potential returns from ref:

        CODE
        GLOB
        LVALUE
        FORMAT
        IO
        VSTRING
        Regexp

     Internally, this uses the built-in function ref and the library
     functions reftype and looks_like_number (from Scalar::Util). The type
     is the return from "reftype" (e.g "ARRAY", "HASH") except that in the
     case of a simple scalar the type is a code to indicate whether it
     seems to be a number (":NUMBER:") or a string (":STRING:").

     Note: if the argument is undefined, the returned type is undef.

   classify_pair

     Examines a pair of arguments that are intended to be processed in
     parallel and are expected to be of the same type:

     If they're both defined, it checks that their types match. If at
     least one is defined, it generates a default of the same type by
     using the classify method. If both are undef, this default is also
     undef.

     In scalar context, it returns just the default value.

     In list context, it returns the default plus the type and the class
     (if it's a blessed reference).

     An options hashref is accepted as a third argument, with allowed
     options:

      o  mismatch_policy

         If argument types mismatch, the behavior is determined by
         the mismatch_policy option, defaulting to 'warn'.
         The other allowed values are 'error' or 'silent'.

      o  also_qualify

         If the "also_qualify" option is set to a true value, then
         the given arguments may be modified in place: if one is
         undef, it will be assigned the determined default.

     Examples:

       my $default_value =
         classify_pair( $arg1, $arg2, { mismatch_policy => 'error' });

       my ( $default_value, $type, $class ) =
         classify_pair( $arg1, $arg2, { mismatch_policy => 'error' });

       classify_pair( $arg1, $arg2, { also_qualify => 1 });

     Note the slightly unusual polymorphic behavior: in scalar context
     returns *just* the default_value, in list context, returns up to
     three values, the default, the type and the class.

SEE ALSO

   Params::Classify

   This covers the argument checking case, where you want to verify that
   something of the correct type was passed. The perl5-porters are
   interested in adding core support for this module: it's fast and likely
   to get faster.

AUTHOR

   Joseph Brenner, <[email protected]>

COPYRIGHT AND LICENSE

   Copyright (C) 2016 by Joseph Brenner

   This library is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.

   See http://dev.perl.org/licenses/ for more information.