package Attribute::Abstract;

use warnings;
use strict;

use Sub::Attribute;
use Carp ();

sub Abstract :ATTR_SUB{
	my($class, $sym, $code_ref) = @_;

	if(!ref $sym){
		Carp::croak('attempt to apply the Abstract attribute to anonymous subroutines');
	}
	if(defined &{$code_ref}){
		Carp::croak('attempt to apply the Abstract attribute to non-abstract methods');
	} 

	*{$sym} = sub{
		my $name = *{$sym}{PACKAGE} . '::' . *{$sym}{NAME};
		Carp::croak(qq{Cannot call abstract method "$name"});
	}
}

1;
__END__