package Number::Object::Filter;

use strict;
use warnings;

use Carp::Clan qw/Number::Object/;
use Class::Inspector;
use String::CamelCase qw(camelize);
use UNIVERSAL::require;

sub init {}
sub filter {}

sub execute {
    my($class, $c, $value, @filters) = @_;

    for my $filter (@filters) {
        my $pkg = $class->resolve_filter($c, $filter);
	croak qq{not installed "$filter" filter} unless $pkg;
        unless (Class::Inspector->loaded($pkg)) {
            $pkg->require or die $@;
            $pkg->init($c);
        }
        $value = $pkg->filter($c, $value);
    }
    $value;
}

sub resolve_filter {
    my($class, $c, $filter) = @_;
    my $pkg = ref $c;
    $filter = camelize $filter;

    for my $f ("$pkg\::Filter::$filter", "Number::Object::Filter::$filter") {
        return $f if Class::Inspector->installed($f);
    }
    return;
}

1;