BEGIN{ package Object::Tiny; use strict 'vars', 'subs'; no strict 'refs'; our $VERSION = '1.10'; sub import { return unless shift eq __PACKAGE__; my $pkg = caller; my $child = !! @{"${pkg}::ISA"}; eval join "\n", "package $pkg;", ($child ? () : "\@${pkg}::ISA = __PACKAGE__;"), map { defined and ! ref and /^[^\W\d]\w*\z/s or die "Invalid accessor name '$_'"; "sub $_ { return \$_[0]->{$_} };" ."sub ${_}_set { return \$_[0]->{$_} = \$_[1] };" ."sub ${_}_forEach { my (\$item,\$subref,\@parm)=(\$_[0]->{$_}, \$_[1],\@_[2..\$#_]); my \$type=ref \$item; \$subref->(\$item), return unless \$type; if (\$type eq 'ARRAY') { \$subref->(\$_,\@parm) for \@\$item} elsif(\$type eq 'HASH') {\$subref->(\$_,\$item->{\$_},\@parm) for sort keys \%\$item}; };" } @_; die "Failed to generate $pkg:$@" if $@; return 1; } sub new { my $class = shift; bless { @_ }, $class; } 1; }