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