package Class::Component::Component::Autocall;

use strict;
use warnings;

use Carp::Clan qw/Class::Component/;

our $AUTOLOAD;
sub AUTOLOAD {
    my $self = shift;
    return unless $self;
    (my $method = $AUTOLOAD) =~ s/.*:://;
    return if $method eq 'DESTROY';

    eval {
#        $self->SUPER::can('AUTOLOAD')->(@_) if $self->SUPER::can('AUTOLOAD');
#        $self->SUPER::can($method)->(@_) if $self->SUPER::can($method);
        $self->NEXT($method => @_);
    };
    my $super_error = $@;

    if (ref($self) && (my $plugin = $self->class_component_methods->{$method})) {
        return $self->call($method, @_);
    }
    
    croak $super_error if $super_error;
    croak sprintf('Can\'t locate object method "%s" via package "%s"', $method, ref($self) || $self);
}

1;
