package Reaction::InterfaceModel::Reflector::SearchSpec;
use Moose::Exporter;
use Carp qw(confess);
use Reaction::Types::Core qw(SimpleStr NonEmptySimpleStr);
#use aliased 'T365::BrokerInterface::SearchSpec';
use aliased 'Moose::Meta::TypeConstraint::Enum';
sub reflect_attributes_from_target {
my ($caller, $foreign) = @_;
confess 'Class name to reflect search specification is required as first argument to reflect_attributes_from_target'
unless $foreign;
# $foreign ||= SearchSpec;
my $meta = Class::MOP::Class->initialize($caller);
my %info;
foreach my $attr (
grep { $_->name !~ /^_/ }
$foreign->meta->get_all_attributes
) {
#warn "Doing ".$attr->name;
my %args;
{ my @copy = qw(required is isa);
@args{@copy} = @{$attr}{@copy};
}
if ($args{isa} eq NonEmptySimpleStr) {
#warn "here ".$attr->name." ".join(', ', %args);
if ($args{required}) {
confess "I really have no idea how we got here";
} else {
$args{isa} = SimpleStr;
$args{required} = 1;
push(@{$info{empty}||=[]}, $attr->name);
}
} else {
push(@{$info{normal}||=[]}, $attr->name);
#warn "here instead ".$attr->name;
}
my $tc;
if (($tc = $args{type_constraint}) && ($tc->isa(Enum))) {
$args{valid_values} = $tc->values;
}
$args{predicate} = "has_".$attr->name;
$meta->add_attribute($attr->name => \%args);
}
\%info;
}
Moose::Exporter->setup_import_methods(
with_caller => [ 'reflect_attributes_from_target' ]
);
1;