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