1#!/usr/bin/perl
2
3package Foo;
4
5use strict;
6use warnings;
7
8use Test::More;
9use Test::Exception;
10
11use Method::Signatures;
12
13
14our $phase;
15BEGIN { $phase = 'compile-time' }
16INIT  { $phase = 'run-time'     }
17
18
19sub method_defined
20{
21    my ($method) = @_;
22
23    local $Test::Builder::Level = $Test::Builder::Level + 1;
24    lives_ok { Foo->$method } "method $method is defined at $phase";
25}
26
27sub method_undefined
28{
29    my ($method) = @_;
30
31    local $Test::Builder::Level = $Test::Builder::Level + 1;
32    throws_ok { 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.
37method top_level_default() {}
38
39# Turn it off.
40use Method::Signatures { compile_at_BEGIN => 0 };
41method top_level_off() {}
42
43# And on again.
44use Method::Signatures { compile_at_BEGIN => 1 };
45method top_level_on() {}
46
47# Now turn it off inside a lexical scope
48{
49    use Method::Signatures { compile_at_BEGIN => 0 };
50    method inner_scope_off() {}
51}
52
53# And it's restored.
54method outer_scope_on() {}
55
56
57# at compile-time, some should be defined and others shouldn't be
58BEGIN {
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
67method_defined('top_level_default');
68method_defined('top_level_off');
69method_defined('top_level_on');
70method_defined('inner_scope_off');
71method_defined('outer_scope_on');
72
73
74done_testing;
75