YATT::Lite::Object - fields based, Tcl/Tk like object
package MyProduct { sub MY () {__PACKAGE__} # Shorthand alias. use base qw/YATT::Lite::Object/; # For fields, you must use 'base'. use fields qw/cf_name cf_price/; # Or YATT::Lite::MFields, if you like. sub as_string { (my MY $self, my ($fmt)) = @_; $fmt //= '%s (%d)'; sprintf $fmt, $self->{cf_name}, $self->{cf_price}; # statically checked! } } 1;
Then you can use this class like this:
my $prod = MyProduct->new(name => 'foo', price => 100); print $prod->cget('name');
XXX: See YATT::Lite::docs::whyfields. (But it is not yet translated to English:-<)
my $obj = YATT::Lite::Object->new(cf1 => val1, cf2 => val2, ...); my $obj = YATT::Lite::Object->new({cf1 => val1, cf2 => val2, ...});
Bulk setter(sets multiple configs at once).
$obj->configure(cf1 => val1, cf2 => val2, ...); $obj->configure({cf1 => val1, cf2 => val2, ...});
$obj->cget('cf1') $obj->cget('cf1', 'default')
If your class has method named configure_CFx
, it is called whenever $obj->configure(CFx => val)
is called.
Mainly used for initializing default config values. Typical code will be:
sub after_new { (my MY $self) = @_; $self->SUPER::after_new; $self->{cf_xxx} //= "foo"; $self->{cf_yyy} //= "bar"; # ... }
Ideally, having two hooks is useless. But user-level programmers could forget to call SUPER::new
in their <after_new> hook, which can lead hard to debug situation. So, I divided hooks, one for user-level programmers and the other for framework designers. This _before_after_new
is the later one.