use strict;
use warnings;

use Test::More 'no_plan';

#$Object::InsideOut::DEBUG = 1;

package My::Class; {
    use Object::InsideOut;

    sub auto : Automethod
    {
        my $self = $_[0];
        my $class = ref($self) || $self;

        my $method = $_;

        my ($fld_name) = $method =~ /^[gs]et_(.*)$/;
        if (! $fld_name) {
            return;
        }
        Object::InsideOut->create_field($class, '@'.$fld_name,
                                        "'Name'=>'$fld_name',",
                                        "'Std' =>'$fld_name'");

        no strict 'refs';
        return *{$class.'::'.$method}{'CODE'};
    }

    sub make
    {
        my ($self, $name, $type) = @_;
        My::Class->create_field('@'.$name,
                                ":Field('Std' =>'$name',",
                                "       'Type' => '$type')",
                                ":Name($name)");
    }
}


package My::Sub; {
    use Object::InsideOut qw(My::Class);

    my @data :Field('set'=>'munge');
}


package main;

MAIN:
{
    my $obj = My::Sub->new();

    $obj->set_data(5);
    can_ok($obj, qw(get_data set_data));
    is($obj->get_data(), 5              => 'Method works');
    can_ok('My::Sub', qw(get_data set_data));
    $obj->munge('hello');
    is($obj->get_data(), 5              => 'Not munged');

    $obj->make('foo', 'numeric');
    can_ok($obj, qw(get_foo set_foo));
    $obj->set_foo(99);
    is($obj->get_foo(), 99              => 'Dynamic foo');

    #print(STDERR $obj->dump(1), "\n");
}

exit(0);

# EOF
