Commit | Line | Data |
5424bb4a |
1 | #!perl |
2 | |
3 | package Foo; |
4 | |
5 | use strict; |
6 | use warnings FATAL => 'all'; |
7 | |
8 | use Test::More; |
9 | use Test::Fatal; |
10 | |
11 | use Function::Parameters { method => { defaults => 'method', runtime => 0 } }; |
12 | |
13 | |
14 | our $phase; |
15 | BEGIN { $phase = 'compile-time' } |
16 | INIT { $phase = 'run-time' } |
17 | |
18 | |
19 | sub method_defined |
20 | { |
21 | my ($method) = @_; |
22 | |
23 | local $Test::Builder::Level = $Test::Builder::Level + 1; |
24 | is exception { Foo->$method }, undef, "method $method is defined at $phase"; |
25 | } |
26 | |
27 | sub method_undefined |
28 | { |
29 | my ($method) = @_; |
30 | |
31 | local $Test::Builder::Level = $Test::Builder::Level + 1; |
32 | like exception { Foo->$method }, qr/Can't locate object method/, "method $method is undefined at $phase"; |
33 | } |
34 | |
35 | |
36 | # The default configuration with compile at BEGIN on. |
37 | method top_level_default() {} |
38 | |
39 | # Turn it off. |
40 | use Function::Parameters { method => { defaults => 'method', runtime => 1 } }; |
41 | method top_level_off() {} |
42 | |
43 | # And on again. |
44 | use Function::Parameters { method => { defaults => 'method', runtime => 0 } }; |
45 | method top_level_on() {} |
46 | |
47 | # Now turn it off inside a lexical scope |
48 | { |
49 | use Function::Parameters { method => { defaults => 'method', runtime => 1 } }; |
50 | method inner_scope_off() {} |
51 | } |
52 | |
53 | # And it's restored. |
54 | method outer_scope_on() {} |
55 | |
56 | |
57 | # at compile-time, some should be defined and others shouldn't be |
58 | BEGIN { |
59 | method_defined('top_level_default'); |
60 | method_undefined('top_level_off'); |
61 | method_defined('top_level_on'); |
62 | method_undefined('inner_scope_off'); |
63 | method_defined('outer_scope_on'); |
64 | } |
65 | |
66 | # by run-time, they should _all_ be defined |
67 | method_defined('top_level_default'); |
68 | method_defined('top_level_off'); |
69 | method_defined('top_level_on'); |
70 | method_defined('inner_scope_off'); |
71 | method_defined('outer_scope_on'); |
72 | |
73 | |
74 | done_testing; |