1package t::Object::HookedOverloaded;
2
3sub mysub (&) {
4    package t::Object::HookedOverloaded::mysub;
5    use overload q[&{}] => sub { shift->{code} }, fallback => 1;
6    bless { code => $_[0] };
7}
8
9use Class::InsideOut ':std';
10
11# $_ has the first argument in it for convenience
12public integer => my %integer, {
13    set_hook => mysub { /\A\d+\z/ or die "must be an integer\n" },
14};
15
16# first argument is also available directly
17public word => my %word, {
18    set_hook => mysub { $_[0] =~ /\A\w+\z/ or die "must be a Perl word\n" },
19};
20
21# Changing $_ changes what gets stored
22public uppercase => my %uppercase, {
23    set_hook => mysub { $_[0] = uc },
24};
25
26# Full @_ is available, but only first gets stored
27public list => my %list, {
28    set_hook => mysub { $_ = ref $_ eq 'ARRAY' ? $_ : [ @_ ] },
29    get_hook => mysub { @$_ },
30};
31
32public reverser => my %reverser, {
33    set_hook => mysub { $_ = (ref $_ eq 'ARRAY') ? $_ : [ @_ ] },
34    get_hook => mysub {  reverse @$_ }
35};
36
37public write_only => my %only_only, {
38    get_hook => mysub { die "is write-only\n" }
39};
40
41sub new {
42    register( bless {}, shift );
43}
44
451;
46