our $VERSION = '0.01';
our $AUTHORITY = 'cpan:STEVAN';
-# no need to get fancy here ...
-sub new { bless {} => (shift) }
+__PACKAGE__->meta->add_attribute('method_exclusions' => (
+ init_arg => 'excludes',
+ reader => 'get_method_exclusions',
+ default => sub { [] }
+));
+
+__PACKAGE__->meta->add_attribute('method_aliases' => (
+ init_arg => 'alias',
+ reader => 'get_method_aliases',
+ default => sub { {} }
+));
+
+sub new {
+ my ($class, %params) = @_;
+
+ if (exists $params{excludes}) {
+ # I wish we had coercion here :)
+ $params{excludes} = (ref $params{excludes} eq 'ARRAY'
+ ? $params{excludes}
+ : [ $params{excludes} ]);
+ }
+
+ $class->meta->new_object(%params);
+}
+
+sub is_method_excluded {
+ my ($self, $method_name) = @_;
+ foreach (@{$self->get_method_exclusions}) {
+ return 1 if $_ eq $method_name;
+ }
+ return 0;
+}
+
+sub is_method_aliased {
+ my ($self, $method_name) = @_;
+ exists $self->get_method_aliases->{$method_name} ? 1 : 0
+}
+
+sub is_aliased_method {
+ my ($self, $method_name) = @_;
+ my %aliased_names = reverse %{$self->get_method_aliases};
+ exists $aliased_names{$method_name} ? 1 : 0;
+}
sub apply {
my $self = shift;
$self->check_role_exclusions(@_);
$self->check_required_methods(@_);
+ $self->check_required_attributes(@_);
$self->apply_attributes(@_);
$self->apply_methods(@_);
sub check_role_exclusions { die "Abstract Method" }
sub check_required_methods { die "Abstract Method" }
+sub check_required_attributes { die "Abstract Method" }
+
sub apply_attributes { die "Abstract Method" }
sub apply_methods { die "Abstract Method" }
sub apply_override_method_modifiers { die "Abstract Method" }
=item B<meta>
+=item B<get_method_exclusions>
+
+=item B<is_method_excluded>
+
+=item B<get_method_aliases>
+
+=item B<is_aliased_method>
+
+=item B<is_method_aliased>
+
=item B<apply>
+=item B<check_role_exclusions>
+
=item B<check_required_methods>
-=item B<check_role_exclusions>
+=item B<check_required_attributes>
=item B<apply_attributes>