.\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Kwargs 3pm" .TH Kwargs 3pm "2011-01-24" "perl v5.12.4" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Kwargs \- Simple, clean handing of named/keyword arguments. .SH "VERSION" .IX Header "VERSION" version 0.01 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Kwargs; \& \& # just named \& my ($foo, $bar, baz) = kw @_, qw(foo bar baz); \& \& # positional followed by named \& my ($pos, $opt_one, $opt_two) = kwn @_, 1, qw(opt_one opt_two) \& \& # just a hashref \& my $opts = kw @_; \& \& # positional then hashref \& my ($one, $two, $opts) = kwn @_, 2; .Ve .SH "WHY?" .IX Header "WHY?" Named arguments are good, especially when you take lots of (sometimes optional) arguments. There are two styles of passing named arguments (by convention) in perl though, with and without braces: .PP .Vb 4 \& sub foo { \& my $args = shift; \& my $bar = $args\->{bar}; \& } \& \& foo({ bar => \*(Aqbaz\*(Aq }); \& \& sub bar { \& my %args = @_; \& my $foo = $args{foo}; \& } \& \& bar(foo => \*(Aqbaz\*(Aq); .Ve .PP If you want to support both calling styles (because it should be mainly a style issue), then you have to do something like this: .PP .Vb 4 \& sub foo { \& my $args = ref $_[0] eq \*(AqHASH\*(Aq ? $_[0] : { @_ }; \& my $bar = $args\->{bar}; \& } .Ve .PP Which is annoying, and not even entirely correct. What if someone wanted to pass in a tied object for their optional arguments? That could work, but what are the right semantics for checking for it? It also gets uglier if you want to unpack your keyword arguments in one line for clarity: .PP .Vb 4 \& sub foo { \& my ($one, $two, $three) = \& @{ ref $_[0] eq \*(AqHASH\*(Aq ? $_[0] : { @_ } }{qw(one two three) }; \& } .Ve .PP Did I say clarity? \fB\s-1HAHAHAHAHA\s0!\fR Surely no one would actually put something like that in his code. Except I found myself typing this very thing, and \&\fIThat Is Why\fR. .SH "EXPORTS" .IX Header "EXPORTS" Two functions (kw and kwn) are exported by default. You can also ask for them individually or rename them to something else. See Sub::Exporter for details. .ie n .SS "kw(@array, @names)" .el .SS "kw(@array, \f(CW@names\fP)" .IX Subsection "kw(@array, @names)" Short for \f(CW\*(C`kwn(@array, 0, @names)\*(C'\fR .ie n .SS "kwn(@array, $number_of_positional_args, @names)" .el .SS "kwn(@array, \f(CW$number_of_positional_args\fP, \f(CW@names\fP)" .IX Subsection "kwn(@array, $number_of_positional_args, @names)" Conceptually shifts off n positional arguments from array, then figures out whether the rest of the array is a list of key-value pairs or a single argument (usually, but not necessarily, a hashref). If you passed in any \&\f(CW@names\fR, these are used as keys into the hash, and the values at those keys are appended to any positional arguments and returned. If you do not pass \f(CW@names\fR, you will get a hashref (or whatever the single argument was, like a tied object) back. .PP Note that if the single argument cannot be dereferenced as a hashref, this can die. No attempt is made by this module to handle the exception. .SH "AUTHOR" .IX Header "AUTHOR" Paul Driver .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2011 by Paul Driver . .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.