diff options
-rw-r--r-- | Fun.xs | 14 | ||||
-rw-r--r-- | t/package.t | 16 |
2 files changed, 28 insertions, 2 deletions
@@ -248,8 +248,18 @@ static OP *parse_fun(pTHX_ GV *namegv, SV *psobj, U32 *flagsp) floor = start_subparse(0, CVf_ANON); lex_read_space(0); - if (isIDFIRST(*(PL_parser->bufptr))) { - function_name = parse_idword(""); + if (isIDFIRST(*(PL_parser->bufptr)) || *(PL_parser->bufptr) == ':') { + function_name = sv_2mortal(newSVpvs("")); + while (isIDFIRST(*(PL_parser->bufptr)) || *(PL_parser->bufptr) == ':') { + if (lex_peek_unichar(0) == ':') { + demand_unichar(':', DEMAND_IMMEDIATE); + demand_unichar(':', DEMAND_IMMEDIATE); + sv_catpvs(function_name, "::"); + } + else { + sv_catsv(function_name, parse_idword("")); + } + } } lex_read_space(0); diff --git a/t/package.t b/t/package.t new file mode 100644 index 0000000..2e672d1 --- /dev/null +++ b/t/package.t @@ -0,0 +1,16 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +use Fun; + +fun Foo::foo ($x, $y) { + $x + $y; +} + +ok(!main->can('foo')); +ok(Foo->can('foo')); +is(Foo::foo(1, 2), 3); + +done_testing; |