[perldocjp-cvs 1332] CVS update: docs/modules/autodie-2.06_01/autodie

Back to archive index

argra****@users***** argra****@users*****
2011年 9月 7日 (水) 03:05:06 JST


Index: docs/modules/autodie-2.06_01/autodie/exception.pod
diff -u /dev/null docs/modules/autodie-2.06_01/autodie/exception.pod:1.1
--- /dev/null	Wed Sep  7 03:05:06 2011
+++ docs/modules/autodie-2.06_01/autodie/exception.pod	Wed Sep  7 03:05:06 2011
@@ -0,0 +1,529 @@
+
+=encoding euc-jp
+
+=head1 NAME
+
+=begin original
+
+autodie::exception - Exceptions from autodying functions.
+
+=end original
+
+autodie::exception - autodie した関数の例外
+
+=head1 SYNOPSIS
+
+    eval {
+        use autodie;
+
+        open(my $fh, '<', 'some_file.txt');
+
+        ...
+    };
+
+    if (my $E = $@) {
+        say "Ooops!  ",$E->caller," had problems: $@";
+    }
+
+=head1 DESCRIPTION
+
+=begin original
+
+When an L<autodie> enabled function fails, it generates an
+C<autodie::exception> object.  This can be interrogated to
+determine further information about the error that occurred.
+
+=end original
+
+When an L<autodie> enabled function fails, it generates an
+C<autodie::exception> object.  This can be interrogated to
+determine further information about the error that occurred.
+(TBT)
+
+=begin original
+
+This document is broken into two sections; those methods that
+are most useful to the end-developer, and those methods for
+anyone wishing to subclass or get very familiar with
+C<autodie::exception>.
+
+=end original
+
+This document is broken into two sections; those methods that
+are most useful to the end-developer, and those methods for
+anyone wishing to subclass or get very familiar with
+C<autodie::exception>.
+(TBT)
+
+=head2 Common Methods
+
+=begin original
+
+These methods are intended to be used in the everyday dealing
+of exceptions.
+
+=end original
+
+These methods are intended to be used in the everyday dealing
+of exceptions.
+(TBT)
+
+=begin original
+
+The following assume that the error has been copied into
+a separate scalar:
+
+=end original
+
+The following assume that the error has been copied into
+a separate scalar:
+(TBT)
+
+    if ($E = $@) {
+        ...
+    }
+
+=begin original
+
+This is not required, but is recommended in case any code
+is called which may reset or alter C<$@>.
+
+=end original
+
+This is not required, but is recommended in case any code
+is called which may reset or alter C<$@>.
+(TBT)
+
+=head3 args
+
+    my $array_ref = $E->args;
+
+=begin original
+
+Provides a reference to the arguments passed to the subroutine
+that died.
+
+=end original
+
+Provides a reference to the arguments passed to the subroutine
+that died.
+(TBT)
+
+=head3 function
+
+    my $sub = $E->function;
+
+=begin original
+
+The subroutine (including package) that threw the exception.
+
+=end original
+
+The subroutine (including package) that threw the exception.
+(TBT)
+
+=head3 file
+
+    my $file = $E->file;
+
+=begin original
+
+The file in which the error occurred (eg, C<myscript.pl> or
+C<MyTest.pm>).
+
+=end original
+
+The file in which the error occurred (eg, C<myscript.pl> or
+C<MyTest.pm>).
+(TBT)
+
+=head3 package
+
+    my $package = $E->package;
+
+=begin original
+
+The package from which the exceptional subroutine was called.
+
+=end original
+
+The package from which the exceptional subroutine was called.
+(TBT)
+
+=head3 caller
+
+    my $caller = $E->caller;
+
+=begin original
+
+The subroutine that I<called> the exceptional code.
+
+=end original
+
+The subroutine that I<called> the exceptional code.
+(TBT)
+
+=head3 line
+
+    my $line = $E->line;
+
+=begin original
+
+The line in C<< $E->file >> where the exceptional code was called.
+
+=end original
+
+The line in C<< $E->file >> where the exceptional code was called.
+(TBT)
+
+=head3 context
+
+    my $context = $E->context;
+
+=begin original
+
+The context in which the subroutine was called.  This can be
+'list', 'scalar', or undefined (unknown).  It will never be 'void', as
+C<autodie> always captures the return value in one way or another.
+
+=end original
+
+The context in which the subroutine was called.  This can be
+'list', 'scalar', or undefined (unknown).  It will never be 'void', as
+C<autodie> always captures the return value in one way or another.
+(TBT)
+
+=head3 return
+
+    my $return_value = $E->return;
+
+=begin original
+
+The value(s) returned by the failed subroutine.  When the subroutine
+was called in a list context, this will always be a reference to an
+array containing the results.  When the subroutine was called in
+a scalar context, this will be the actual scalar returned.
+
+=end original
+
+The value(s) returned by the failed subroutine.  When the subroutine
+was called in a list context, this will always be a reference to an
+array containing the results.  When the subroutine was called in
+a scalar context, this will be the actual scalar returned.
+(TBT)
+
+=head3 errno
+
+    my $errno = $E->errno;
+
+=begin original
+
+The value of C<$!> at the time when the exception occurred.
+
+=end original
+
+The value of C<$!> at the time when the exception occurred.
+(TBT)
+
+=begin original
+
+B<NOTE>: This method will leave the main C<autodie::exception> class
+and become part of a role in the future.  You should only call
+C<errno> for exceptions where C<$!> would reasonably have been
+set on failure.
+
+=end original
+
+B<NOTE>: This method will leave the main C<autodie::exception> class
+and become part of a role in the future.  You should only call
+C<errno> for exceptions where C<$!> would reasonably have been
+set on failure.
+(TBT)
+
+=head3 eval_error
+
+    my $old_eval_error = $E->eval_error;
+
+=begin original
+
+The contents of C<$@> immediately after autodie triggered an
+exception.  This may be useful when dealing with modules such
+as L<Text::Balanced> that set (but do not throw) C<$@> on error.
+
+=end original
+
+The contents of C<$@> immediately after autodie triggered an
+exception.  This may be useful when dealing with modules such
+as L<Text::Balanced> that set (but do not throw) C<$@> on error.
+(TBT)
+
+=head3 matches
+
+    if ( $e->matches('open') ) { ... }
+
+    if ( $e ~~ 'open' ) { ... }
+
+=begin original
+
+C<matches> is used to determine whether a
+given exception matches a particular role.  On Perl 5.10,
+using smart-match (C<~~>) with an C<autodie::exception> object
+will use C<matches> underneath.
+
+=end original
+
+C<matches> is used to determine whether a
+given exception matches a particular role.  On Perl 5.10,
+using smart-match (C<~~>) with an C<autodie::exception> object
+will use C<matches> underneath.
+(TBT)
+
+=begin original
+
+An exception is considered to match a string if:
+
+=end original
+
+An exception is considered to match a string if:
+(TBT)
+
+=over 4
+
+=item *
+
+=begin original
+
+For a string not starting with a colon, the string exactly matches the
+package and subroutine that threw the exception.  For example,
+C<MyModule::log>.  If the string does not contain a package name,
+C<CORE::> is assumed.
+
+=end original
+
+For a string not starting with a colon, the string exactly matches the
+package and subroutine that threw the exception.  For example,
+C<MyModule::log>.  If the string does not contain a package name,
+C<CORE::> is assumed.
+(TBT)
+
+=item *
+
+=begin original
+
+For a string that does start with a colon, if the subroutine
+throwing the exception I<does> that behaviour.  For example, the
+C<CORE::open> subroutine does C<:file>, C<:io> and C<:all>.
+
+=end original
+
+For a string that does start with a colon, if the subroutine
+throwing the exception I<does> that behaviour.  For example, the
+C<CORE::open> subroutine does C<:file>, C<:io> and C<:all>.
+(TBT)
+
+=begin original
+
+See L<autodie/CATEGORIES> for futher information.
+
+=end original
+
+See L<autodie/CATEGORIES> for futher information.
+(TBT)
+
+=back
+
+=head2 Advanced methods
+
+=begin original
+
+The following methods, while usable from anywhere, are primarily
+intended for developers wishing to subclass C<autodie::exception>,
+write code that registers custom error messages, or otherwise
+work closely with the C<autodie::exception> model.
+
+=end original
+
+The following methods, while usable from anywhere, are primarily
+intended for developers wishing to subclass C<autodie::exception>,
+write code that registers custom error messages, or otherwise
+work closely with the C<autodie::exception> model.
+(TBT)
+
+=head3 register
+
+    autodie::exception->register( 'CORE::open' => \&mysub );
+
+=begin original
+
+The C<register> method allows for the registration of a message
+handler for a given subroutine.  The full subroutine name including
+the package should be used.
+
+=end original
+
+The C<register> method allows for the registration of a message
+handler for a given subroutine.  The full subroutine name including
+the package should be used.
+(TBT)
+
+=begin original
+
+Registered message handlers will receive the C<autodie::exception>
+object as the first parameter.
+
+=end original
+
+Registered message handlers will receive the C<autodie::exception>
+object as the first parameter.
+(TBT)
+
+=head3 add_file_and_line
+
+    say "Problem occurred",$@->add_file_and_line;
+
+=begin original
+
+Returns the string C< at %s line %d>, where C<%s> is replaced with
+the filename, and C<%d> is replaced with the line number.
+
+=end original
+
+Returns the string C< at %s line %d>, where C<%s> is replaced with
+the filename, and C<%d> is replaced with the line number.
+(TBT)
+
+=begin original
+
+Primarily intended for use by format handlers.
+
+=end original
+
+Primarily intended for use by format handlers.
+(TBT)
+
+=head3 stringify
+
+    say "The error was: ",$@->stringify;
+
+=begin original
+
+Formats the error as a human readable string.  Usually there's no
+reason to call this directly, as it is used automatically if an
+C<autodie::exception> object is ever used as a string.
+
+=end original
+
+Formats the error as a human readable string.  Usually there's no
+reason to call this directly, as it is used automatically if an
+C<autodie::exception> object is ever used as a string.
+(TBT)
+
+=begin original
+
+Child classes can override this method to change how they're
+stringified.
+
+=end original
+
+Child classes can override this method to change how they're
+stringified.
+(TBT)
+
+=head3 format_default
+
+    my $error_string = $E->format_default;
+
+=begin original
+
+This produces the default error string for the given exception,
+I<without using any registered message handlers>.  It is primarily
+intended to be called from a message handler when they have
+been passed an exception they don't want to format.
+
+=end original
+
+This produces the default error string for the given exception,
+I<without using any registered message handlers>.  It is primarily
+intended to be called from a message handler when they have
+been passed an exception they don't want to format.
+(TBT)
+
+=begin original
+
+Child classes can override this method to change how default
+messages are formatted.
+
+=end original
+
+Child classes can override this method to change how default
+messages are formatted.
+(TBT)
+
+=head3 new
+
+    my $error = autodie::exception->new(
+        args => \@_,
+        function => "CORE::open",
+        errno => $!,
+        context => 'scalar',
+        return => undef,
+    );
+
+
+=begin original
+
+Creates a new C<autodie::exception> object.  Normally called
+directly from an autodying function.  The C<function> argument
+is required, its the function we were trying to call that
+generated the exception.  The C<args> parameter is optional.
+
+=end original
+
+Creates a new C<autodie::exception> object.  Normally called
+directly from an autodying function.  The C<function> argument
+is required, its the function we were trying to call that
+generated the exception.  The C<args> parameter is optional.
+(TBT)
+
+=begin original
+
+The C<errno> value is optional.  In versions of C<autodie::exception>
+1.99 and earlier the code would try to automatically use the
+current value of C<$!>, but this was unreliable and is no longer
+supported.
+
+=end original
+
+The C<errno> value is optional.  In versions of C<autodie::exception>
+1.99 and earlier the code would try to automatically use the
+current value of C<$!>, but this was unreliable and is no longer
+supported.
+(TBT)
+
+=begin original
+
+Atrributes such as package, file, and caller are determined
+automatically, and cannot be specified.
+
+=end original
+
+Atrributes such as package, file, and caller are determined
+automatically, and cannot be specified.
+(TBT)
+
+=head1 SEE ALSO
+
+L<autodie>, L<autodie::exception::system>
+
+=head1 LICENSE
+
+Copyright (C)2008 Paul Fenwick
+
+This is free software.  You may modify and/or redistribute this
+code under the same terms as Perl 5.10 itself, or, at your option,
+any later version of Perl 5.
+
+=head1 AUTHOR
+
+Paul Fenwick E<lt>pjf****@perlt*****<gt>
+
Index: docs/modules/autodie-2.06_01/autodie/hints.pod
diff -u /dev/null docs/modules/autodie-2.06_01/autodie/hints.pod:1.1
--- /dev/null	Wed Sep  7 03:05:06 2011
+++ docs/modules/autodie-2.06_01/autodie/hints.pod	Wed Sep  7 03:05:06 2011
@@ -0,0 +1,679 @@
+
+=encoding euc-jp
+
+=head1 NAME
+
+=begin original
+
+autodie::hints - Provide hints about user subroutines to autodie
+
+=end original
+
+autodie::hints - ユーザーのサブルーチンを autodie させるヒントを提供する
+
+=head1 SYNOPSIS
+
+    package Your::Module;
+
+    our %DOES = ( 'autodie::hints::provider' => 1 );
+
+    sub AUTODIE_HINTS {
+        return {
+            foo => { scalar => HINTS, list => SOME_HINTS },
+            bar => { scalar => HINTS, list => MORE_HINTS },
+        }
+    }
+
+    # Later, in your main program...
+
+    use Your::Module qw(foo bar);
+    use autodie      qw(:default foo bar);
+
+    foo();         # succeeds or dies based on scalar hints
+
+    # Alternatively, hints can be set on subroutines we've
+    # imported.
+
+    use autodie::hints;
+    use Some::Module qw(think_positive);
+
+    BEGIN {
+        autodie::hints->set_hints_for(
+            \&think_positive,
+            {
+                fail => sub { $_[0] <= 0 }
+            }
+        )
+    }
+    use autodie qw(think_positive);
+
+    think_positive(...);    # Returns positive or dies.
+
+
+=head1 DESCRIPTION
+
+=head2 Introduction
+
+=begin original
+
+The L<autodie> pragma is very smart when it comes to working with
+Perl's built-in functions.  The behaviour for these functions are
+fixed, and C<autodie> knows exactly how they try to signal failure.
+
+=end original
+
+L<autodie> プラグマは、Perl の組み込み関数に対する動作はとても
+賢いです。
+これらの関数の振る舞いは固定されていて、C<autodie> はこれらがどのように
+失敗を知らせるかを正確に知っています。
+
+=begin original
+
+But what about user-defined subroutines from modules?  If you use
+C<autodie> on a user-defined subroutine then it assumes the following
+behaviour to demonstrate failure:
+
+=end original
+
+But what about user-defined subroutines from modules?  If you use
+C<autodie> on a user-defined subroutine then it assumes the following
+behaviour to demonstrate failure:
+(TBT)
+
+=over
+
+=item *
+
+=begin original
+
+A false value, in scalar context
+
+=end original
+
+A false value, in scalar context
+(TBT)
+
+=item * 
+
+=begin original
+
+An empty list, in list context
+
+=end original
+
+An empty list, in list context
+(TBT)
+
+=item *
+
+=begin original
+
+A list containing a single undef, in list context
+
+=end original
+
+A list containing a single undef, in list context
+(TBT)
+
+=back
+
+=begin original
+
+All other return values (including the list of the single zero, and the
+list containing a single empty string) are considered successful.  However,
+real-world code isn't always that easy.  Perhaps the code you're working
+with returns a string containing the word "FAIL" upon failure, or a
+two element list containing C<(undef, "human error message")>.  To make
+autodie work with these sorts of subroutines, we have
+the I<hinting interface>.
+
+=end original
+
+All other return values (including the list of the single zero, and the
+list containing a single empty string) are considered successful.  However,
+real-world code isn't always that easy.  Perhaps the code you're working
+with returns a string containing the word "FAIL" upon failure, or a
+two element list containing C<(undef, "human error message")>.  To make
+autodie work with these sorts of subroutines, we have
+the I<hinting interface>.
+(TBT)
+
+=begin original
+
+The hinting interface allows I<hints> to be provided to C<autodie>
+on how it should detect failure from user-defined subroutines.  While
+these I<can> be provided by the end-user of C<autodie>, they are ideally
+written into the module itself, or into a helper module or sub-class
+of C<autodie> itself.
+
+=end original
+
+The hinting interface allows I<hints> to be provided to C<autodie>
+on how it should detect failure from user-defined subroutines.  While
+these I<can> be provided by the end-user of C<autodie>, they are ideally
+written into the module itself, or into a helper module or sub-class
+of C<autodie> itself.
+(TBT)
+
+=head2 What are hints?
+
+=begin original
+
+A I<hint> is a subroutine or value that is checked against the
+return value of an autodying subroutine.  If the match returns true,
+C<autodie> considers the subroutine to have failed.
+
+=end original
+
+A I<hint> is a subroutine or value that is checked against the
+return value of an autodying subroutine.  If the match returns true,
+C<autodie> considers the subroutine to have failed.
+(TBT)
+
+=begin original
+
+If the hint provided is a subroutine, then C<autodie> will pass
+the complete return value to that subroutine.  If the hint is
+any other value, then C<autodie> will smart-match against the
+value provided.  In Perl 5.8.x there is no smart-match operator, and as such
+only subroutine hints are supported in these versions.
+
+=end original
+
+If the hint provided is a subroutine, then C<autodie> will pass
+the complete return value to that subroutine.  If the hint is
+any other value, then C<autodie> will smart-match against the
+value provided.  In Perl 5.8.x there is no smart-match operator, and as such
+only subroutine hints are supported in these versions.
+(TBT)
+
+=begin original
+
+Hints can be provided for both scalar and list contexts.  Note
+that an autodying subroutine will never see a void context, as
+C<autodie> always needs to capture the return value for examination.
+Autodying subroutines called in void context act as if they're called
+in a scalar context, but their return value is discarded after it
+has been checked.
+
+=end original
+
+Hints can be provided for both scalar and list contexts.  Note
+that an autodying subroutine will never see a void context, as
+C<autodie> always needs to capture the return value for examination.
+Autodying subroutines called in void context act as if they're called
+in a scalar context, but their return value is discarded after it
+has been checked.
+(TBT)
+
+=head2 Example hints
+
+=begin original
+
+Hints may consist of scalars, array references, regular expressions and
+subroutine references.  You can specify different hints for how
+failure should be identified in scalar and list contexts.
+
+=end original
+
+Hints may consist of scalars, array references, regular expressions and
+subroutine references.  You can specify different hints for how
+failure should be identified in scalar and list contexts.
+(TBT)
+
+=begin original
+
+These examples apply for use in the C<AUTODIE_HINTS> subroutine and when
+calling C<autodie::hints->set_hints_for()>.
+
+=end original
+
+These examples apply for use in the C<AUTODIE_HINTS> subroutine and when
+calling C<autodie::hints->set_hints_for()>.
+(TBT)
+
+=begin original
+
+The most common context-specific hints are:
+
+=end original
+
+The most common context-specific hints are:
+(TBT)
+
+        # Scalar failures always return undef:
+            {  scalar => undef  }
+
+        # Scalar failures return any false value [default expectation]:
+            {  scalar => sub { ! $_[0] }  }
+
+        # Scalar failures always return zero explicitly:
+            {  scalar => '0'  }
+
+        # List failures always return an empty list:
+            {  list => []  }
+
+        # List failures return () or (undef) [default expectation]:
+            {  list => sub { ! @_ || @_ == 1 && !defined $_[0] }  }
+
+        # List failures return () or a single false value:
+            {  list => sub { ! @_ || @_ == 1 && !$_[0] }  }
+
+        # List failures return (undef, "some string")
+            {  list => sub { @_ == 2 && !defined $_[0] }  }
+
+        # Unsuccessful foo() returns 'FAIL' or '_FAIL' in scalar context,
+        #                    returns (-1) in list context...
+        autodie::hints->set_hints_for(
+            \&foo,
+            {
+                scalar => qr/^ _? FAIL $/xms,
+                list   => [-1],
+            }
+        );
+
+        # Unsuccessful foo() returns 0 in all contexts...
+        autodie::hints->set_hints_for(
+            \&foo,
+            {
+                scalar => 0,
+                list   => [0],
+            }
+        );
+
+=begin original
+
+This "in all contexts" construction is very common, and can be
+abbreviated, using the 'fail' key.  This sets both the C<scalar>
+and C<list> hints to the same value:
+
+=end original
+
+This "in all contexts" construction is very common, and can be
+abbreviated, using the 'fail' key.  This sets both the C<scalar>
+and C<list> hints to the same value:
+(TBT)
+
+        # Unsuccessful foo() returns 0 in all contexts...
+        autodie::hints->set_hints_for(
+            \&foo,
+            {
+                fail => sub { @_ == 1 and defined $_[0] and $_[0] == 0 }
+            }
+	);
+
+        # Unsuccessful think_positive() returns negative number on failure...
+        autodie::hints->set_hints_for(
+            \&think_positive,
+            {
+                fail => sub { $_[0] < 0 }
+            }
+	);
+
+        # Unsuccessful my_system() returns non-zero on failure...
+        autodie::hints->set_hints_for(
+            \&my_system,
+            {
+                fail => sub { $_[0] != 0 }
+            }
+	);
+
+=head1 Manually setting hints from within your program
+
+=begin original
+
+If you are using a module which returns something special on failure, then
+you can manually create hints for each of the desired subroutines.  Once
+the hints are specified, they are available for all files and modules loaded
+thereafter, thus you can move this work into a module and it will still
+work.
+
+=end original
+
+If you are using a module which returns something special on failure, then
+you can manually create hints for each of the desired subroutines.  Once
+the hints are specified, they are available for all files and modules loaded
+thereafter, thus you can move this work into a module and it will still
+work.
+(TBT)
+
+	use Some::Module qw(foo bar);
+	use autodie::hints;
+
+	autodie::hints->set_hints_for(
+		\&foo,
+		{
+			scalar => SCALAR_HINT,
+			list   => LIST_HINT,
+		}
+	);
+	autodie::hints->set_hints_for(
+		\&bar,
+                { fail => SOME_HINT, }
+	);
+
+=begin original
+
+It is possible to pass either a subroutine reference (recommended) or a fully
+qualified subroutine name as the first argument.  This means you can set hints
+on modules that I<might> get loaded:
+
+=end original
+
+It is possible to pass either a subroutine reference (recommended) or a fully
+qualified subroutine name as the first argument.  This means you can set hints
+on modules that I<might> get loaded:
+(TBT)
+
+	use autodie::hints;
+	autodie::hints->set_hints_for(
+		'Some::Module:bar', { fail => SCALAR_HINT, }
+	);
+
+=begin original
+
+This technique is most useful when you have a project that uses a
+lot of third-party modules.  You can define all your possible hints
+in one-place.  This can even be in a sub-class of autodie.  For
+example:
+
+=end original
+
+This technique is most useful when you have a project that uses a
+lot of third-party modules.  You can define all your possible hints
+in one-place.  This can even be in a sub-class of autodie.  For
+example:
+(TBT)
+
+        package my::autodie;
+
+        use parent qw(autodie);
+        use autodie::hints;
+
+        autodie::hints->set_hints_for(...);
+
+        1;
+
+=begin original
+
+You can now C<use my::autodie>, which will work just like the standard
+C<autodie>, but is now aware of any hints that you've set.
+
+=end original
+
+You can now C<use my::autodie>, which will work just like the standard
+C<autodie>, but is now aware of any hints that you've set.
+(TBT)
+
+=head1 Adding hints to your module
+
+=begin original
+
+C<autodie> provides a passive interface to allow you to declare hints for
+your module.  These hints will be found and used by C<autodie> if it
+is loaded, but otherwise have no effect (or dependencies) without autodie.
+To set these, your module needs to declare that it I<does> the
+C<autodie::hints::provider> role.  This can be done by writing your
+own C<DOES> method, using a system such as C<Class::DOES> to handle
+the heavy-lifting for you, or declaring a C<%DOES> package variable
+with a C<autodie::hints::provider> key and a corresponding true value.
+
+=end original
+
+C<autodie> provides a passive interface to allow you to declare hints for
+your module.  These hints will be found and used by C<autodie> if it
+is loaded, but otherwise have no effect (or dependencies) without autodie.
+To set these, your module needs to declare that it I<does> the
+C<autodie::hints::provider> role.  This can be done by writing your
+own C<DOES> method, using a system such as C<Class::DOES> to handle
+the heavy-lifting for you, or declaring a C<%DOES> package variable
+with a C<autodie::hints::provider> key and a corresponding true value.
+(TBT)
+
+=begin original
+
+Note that checking for a C<%DOES> hash is an C<autodie>-only
+short-cut.  Other modules do not use this mechanism for checking
+roles, although you can use the C<Class::DOES> module from the
+CPAN to allow it.
+
+=end original
+
+Note that checking for a C<%DOES> hash is an C<autodie>-only
+short-cut.  Other modules do not use this mechanism for checking
+roles, although you can use the C<Class::DOES> module from the
+CPAN to allow it.
+(TBT)
+
+=begin original
+
+In addition, you must define a C<AUTODIE_HINTS> subroutine that returns
+a hash-reference containing the hints for your subroutines:
+
+=end original
+
+In addition, you must define a C<AUTODIE_HINTS> subroutine that returns
+a hash-reference containing the hints for your subroutines:
+(TBT)
+
+        package Your::Module;
+
+        # We can use the Class::DOES from the CPAN to declare adherence
+        # to a role.
+
+        use Class::DOES 'autodie::hints::provider' => 1;
+
+        # Alternatively, we can declare the role in %DOES.  Note that
+        # this is an autodie specific optimisation, although Class::DOES
+        # can be used to promote this to a true role declaration.
+
+        our %DOES = ( 'autodie::hints::provider' => 1 );
+
+        # Finally, we must define the hints themselves.
+
+	sub AUTODIE_HINTS {
+	    return {
+	        foo => { scalar => HINTS, list => SOME_HINTS },
+	        bar => { scalar => HINTS, list => MORE_HINTS },
+	        baz => { fail => HINTS },
+	    }
+	}
+
+=begin original
+
+This allows your code to set hints without relying on C<autodie> and
+C<autodie::hints> being loaded, or even installed.  In this way your
+code can do the right thing when C<autodie> is installed, but does not
+need to depend upon it to function.
+
+=end original
+
+This allows your code to set hints without relying on C<autodie> and
+C<autodie::hints> being loaded, or even installed.  In this way your
+code can do the right thing when C<autodie> is installed, but does not
+need to depend upon it to function.
+(TBT)
+
+=head1 Insisting on hints
+
+=begin original
+
+When a user-defined subroutine is wrapped by C<autodie>, it will
+use hints if they are available, and otherwise reverts to the
+I<default behaviour> described in the introduction of this document.
+This can be problematic if we expect a hint to exist, but (for
+whatever reason) it has not been loaded.
+
+=end original
+
+When a user-defined subroutine is wrapped by C<autodie>, it will
+use hints if they are available, and otherwise reverts to the
+I<default behaviour> described in the introduction of this document.
+This can be problematic if we expect a hint to exist, but (for
+whatever reason) it has not been loaded.
+(TBT)
+
+=begin original
+
+We can ask autodie to I<insist> that a hint be used by prefixing
+an exclamation mark to the start of the subroutine name.  A lone
+exclamation mark indicates that I<all> subroutines after it must
+have hints declared.
+
+=end original
+
+We can ask autodie to I<insist> that a hint be used by prefixing
+an exclamation mark to the start of the subroutine name.  A lone
+exclamation mark indicates that I<all> subroutines after it must
+have hints declared.
+(TBT)
+
+	# foo() and bar() must have their hints defined
+	use autodie qw( !foo !bar baz );
+
+	# Everything must have hints (recommended).
+	use autodie qw( ! foo bar baz );
+
+	# bar() and baz() must have their hints defined
+	use autodie qw( foo ! bar baz );
+
+        # Enable autodie for all of Perl's supported built-ins,
+        # as well as for foo(), bar() and baz().  Everything must
+        # have hints.
+        use autodie qw( ! :all foo bar baz );
+
+=begin original
+
+If hints are not available for the specified subroutines, this will cause a
+compile-time error.  Insisting on hints for Perl's built-in functions
+(eg, C<open> and C<close>) is always successful.
+
+=end original
+
+If hints are not available for the specified subroutines, this will cause a
+compile-time error.  Insisting on hints for Perl's built-in functions
+(eg, C<open> and C<close>) is always successful.
+(TBT)
+
+=begin original
+
+Insisting on hints is I<strongly> recommended.
+
+=end original
+
+Insisting on hints is I<strongly> recommended.
+(TBT)
+
+=head1 Diagnostics
+
+=over 4
+
+=item Attempts to set_hints_for unidentifiable subroutine
+
+=begin original
+
+You've called C<< autodie::hints->set_hints_for() >> using a subroutine
+reference, but that reference could not be resolved back to a
+subroutine name.  It may be an anonymous subroutine (which can't
+be made autodying), or may lack a name for other reasons.
+
+=end original
+
+You've called C<< autodie::hints->set_hints_for() >> using a subroutine
+reference, but that reference could not be resolved back to a
+subroutine name.  It may be an anonymous subroutine (which can't
+be made autodying), or may lack a name for other reasons.
+(TBT)
+
+=begin original
+
+If you receive this error with a subroutine that has a real name,
+then you may have found a bug in autodie.  See L<autodie/BUGS>
+for how to report this.
+
+=end original
+
+If you receive this error with a subroutine that has a real name,
+then you may have found a bug in autodie.  See L<autodie/BUGS>
+for how to report this.
+(TBT)
+
+=item fail hints cannot be provided with either scalar or list hints for %s
+
+=begin original
+
+When defining hints, you can either supply both C<list> and
+C<scalar> keywords, I<or> you can provide a single C<fail> keyword.
+You can't mix and match them.
+
+=end original
+
+When defining hints, you can either supply both C<list> and
+C<scalar> keywords, I<or> you can provide a single C<fail> keyword.
+You can't mix and match them.
+(TBT)
+
+=item %s hint missing for %s
+
+=begin original
+
+You've provided either a C<scalar> hint without supplying
+a C<list> hint, or vice-versa.  You I<must> supply both C<scalar>
+and C<list> hints, I<or> a single C<fail> hint.
+
+=end original
+
+You've provided either a C<scalar> hint without supplying
+a C<list> hint, or vice-versa.  You I<must> supply both C<scalar>
+and C<list> hints, I<or> a single C<fail> hint.
+(TBT)
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+=over 
+
+=item *
+
+=begin original
+
+Dr Damian Conway for suggesting the hinting interface and providing the
+example usage.
+
+=end original
+
+Dr Damian Conway for suggesting the hinting interface and providing the
+example usage.
+(TBT)
+
+=item *
+
+=begin original
+
+Jacinta Richardson for translating much of my ideas into this
+documentation.
+
+=end original
+
+Jacinta Richardson for translating much of my ideas into this
+documentation.
+(TBT)
+
+=back
+
+=head1 AUTHOR
+
+Copyright 2009, Paul Fenwick E<lt>pjf****@perlt*****<gt>
+
+=head1 LICENSE
+
+This module is free software.  You may distribute it under the
+same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<autodie>, L<Class::DOES>
+
+=cut
+



perldocjp-cvs メーリングリストの案内
Back to archive index