File: fresh.pm

package info (click to toggle)
libkavorka-perl 0.036-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 712 kB
  • ctags: 213
  • sloc: perl: 2,865; makefile: 25
file content (50 lines) | stat: -rw-r--r-- 1,214 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use 5.014;
use strict;
use warnings;

package Kavorka::TraitFor::Sub::fresh;

our $AUTHORITY = 'cpan:TOBYINK';
our $VERSION   = '0.036';

use Moo::Role;
use Types::Standard qw(Any);
use Sub::Util ();
use Carp qw(croak);
use namespace::sweep;

my $stash_name = sub {
	Sub::Util::subname($_[0]) =~ m/^(.+)::(.+?)$/ ? $1 : undef;
};

before install_sub => sub
{
	my $self = shift;
	
	croak("The 'fresh' trait cannot be applied to lexical methods")
		if $self->is_lexical;
	
	croak("The 'fresh' trait cannot be applied to anonymous methods")
		if $self->is_anonymous;
	
	croak("The 'fresh' trait may only be applied to methods")
		if $self->invocation_style ne 'method';
	
	my ($pkg, $name) = ($self->qualified_name =~ /^(.+)::(\w+)$/);
	my $existing = $pkg->can($name) or return;
	my $existing_source = $stash_name->($existing);
	
	if ($pkg->isa($existing_source) or $existing_source eq 'UNIVERSAL')
	{
		croak("Method '$name' is inherited from '$existing_source'; not fresh");
	}
	
	if ($pkg->DOES($existing_source))
	{
		croak("Method '$name' is provided by role '$existing_source'; not fresh");
	}
	
	croak("Method '$name' already exists in inheritance hierarchy; possible namespace pollution; not fresh");
};

1;