NAME
Object::Base - Multi-threaded base class to establish a class deriving relationship with parent classes
VERSION
version 1.14
ABSTRACT
Multi-threaded base class to establish a class deriving relationship with parent classes
package Foo;
use Object::Base;
attributes ':shared', 'attr1', 'attr2';
#
package Bar;
use Object::Base 'Foo';
my $attr3_def = 6;
my $attr3_val;
attributes ':shared' => undef, 'attr2' => undef, ':lazy',
'attr3' => {
'default' => sub {
my ($self, $key) = @_;
print "> default key=$key\n";
$attr3_val = $attr3_def-1;
return $attr3_def;
},
'getter' => sub {
my ($self, $key) = @_;
print "> getter key=$key\n";
return $attr3_val+1;
},
'setter' => sub {
my ($self, $key, $value) = @_;
print "> setter key=$key value=$value\n";
$attr3_val = $value-1;
},
}
;
#
package main;
use threads;
use threads::shared;
#
# object of Foo
my $foo = Foo->new();
#
# special attribute ':shared'
print "\$foo is ", is_shared($foo)? "shared": "not shared", "\n";
#
# usage of attribute
$foo->attr1(1);
print $foo->attr1, "\n"; # prints '1'
#
# attributes are lvalued
$foo->attr1++;
print $foo->attr1, "\n"; # prints '2'
#
# assigning ref values to shared class attributes
eval { $foo->attr2 = { key1 => 'val1' } }; print "Eval: $@"; # prints error 'Eval: Invalid value for shared scalar at ...'
$foo->attr2({ key2 => 'val2' }); # uses shared_clone assigning ref value
print $foo->attr2->{key2}, "\n"; # prints 'val2'
#
# object of derived class Bar
my $bar = Bar->new();
#
# features are overridable
print "\$bar is ", is_shared($bar)? "shared": "not shared", "\n"; # prints '$bar is not shared'
#
# attributes can be added derived classes
# attributes can have modifiers: default
print "attr3 default value is ", $bar->attr3, "\n"; # prints 'attr3 default value is 6'
#
# attributes can have modifiers: setter
$bar->attr3 = 3;
print "attr3 set", "\n";
#
# attributes can have modifiers: getter
print "attr3 value ", $bar->attr3, " and stored as $attr3_val", "\n"; # prints 'attr3 value 3 and stored as 2'
#
# attributes are inheritable
$bar->attr1(3);
#
# attributes are overridable
eval { $bar->attr2 = 4 }; print "Eval: $@"; # prints error 'Eval: Attribute attr2 is not defined in Bar at ...'
#
# attributes in thread
my $thr1 = threads->create(sub { $foo->attr1 = 5; $bar->attr1 = 5; });
my $thr2 = threads->create(sub { sleep 1; print "\$foo is shared and attr1: ", $foo->attr1, ", \$bar is not shared and attr1: ", $bar->attr1, "\n"; });
# prints '$foo is shared and attr1: 5, $bar is not shared and attr1: 3'
$thr1->join();
$thr2->join();
DESCRIPTION
Object::Base provides blessed and thread-shared(with :shared feature) object with in new method. new method can be used as a constructor and overridable in derived classes. new() should be called in derived class constructors to create and bless self-object.
Derived classes own package automatically uses threads, threads::shared, strict, warnings with using Object::Base. If Perl is not built to support threads; it uses forks, forks::shared instead of threads, threads::shared. Object::Base should be loaded as first module.
Import parameters of Object::Base, define parent classes of derived class. If none of parent classes derived from Object::Base or any parent isn't defined, Object::Base is automatically added in parent classes.
Attributes
Attributes define read-write accessors binded value of same named key in objects own hash if attribute names is valid subroutine identifiers. Otherwise, attribute defines feature to get new features into class.
Attributes;
Lvaluable
Inheritable
Overridable
Redefinable
Modifiers
Attributes can have their own modifiers in hash reference at definition. Attribute modifiers don't work with ':shared' feature.
default
getter method of default value of attribute, otherwise value is default value
attributes
'attr1' => {
'default' => sub {
my ($self, $key) = @_;
return "default value of $key";
},
},
'attr2' => {
'default' => "default value of attr2",
};
getter
getter method of attribute
my $attr1_val;
attributes
'attr1' => {
'getter' => sub {
my ($self, $key) = @_;
return $attr1_val;
},
};
setter
setter method of attribute
my $attr1_val;
attributes
'attr1' => {
'setter' => sub {
my ($self, $key, $value) = @_;
$attr1_val = $value;
},
};
Features
:shared
Class will be craated as thread-shared. But attribute modifiers don't work with ':shared' feature.
:lazy
Attributes will be initialized with default values using default modifier at first fetching or storing instead of object construction with new().
REPOSITORY
GitHub https://github.com/orkunkaraduman/p5-Object-Base
CPAN https://metacpan.org/release/Object-Base
SEE ALSO
AUTHOR
Orkun Karaduman <orkunkaraduman@gmail.com>
COPYRIGHT AND LICENSE
Copyright (C) 2017 Orkun Karaduman <orkunkaraduman@gmail.com>
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.