NAME
Ambrosia::core::Object - an abstract base class for classes that are created by Ambrosia::Meta.
VERSION
version 0.010
SYNOPSIS
# file Foo.pm
package Foo;
use strict;
use Ambrosia::Meta;
class
{
public => [qw/foo_pub1 foo_pub2/],
protected => [qw/foo_pro1 foo_pro2/],
private => [qw/foo_pri1 foo_pri2/],
};
sub _init
{
my $self = shift;
$self->SUPER::_init(@_);
$self->foo_pub1 ||= 'foo_pub1';
$self->foo_pub2 ||= 'foo_pub2';
$self->foo_pri1 ||= 'foo_pri1';
$self->foo_pri2 ||= 'foo_pri2';
$self->foo_pro1 ||= 2;
$self->foo_pro2 ||= 'foo_pro2';
}
sub count
{
shift->foo_pro1
}
1;
# file Bar.pm
package Bar;
use strict;
use Ambrosia::Meta;
class sealed
{
extends => [qw/Foo/],
public => [qw/bar_pub1 bar_pub2/],
protected => [qw/bar_pro1 bar_pro2/],
private => [qw/bar_pri1 bar_pri2 list/],
};
sub _init
{
my $self = shift;
#Ignore all input data
$self->SUPER::_init(foo_pri1=>4);
$self->bar_pub1 = 'bar_pub1';
$self->bar_pub2 = 'bar_pub2';
$self->bar_pri1 = 'bar_pri1';
$self->bar_pri2 = 'bar_pri2';
$self->bar_pro1 = 'bar_pro1';
$self->bar_pro2 = 'bar_pro2';
$self->list = [] unless defined $self->list;
push @{$self->list}, (new Foo(foo_pub1 => 'list1.1', foo_pub2 => 'list1.2'),
new Foo(foo_pub1 => 'list2.1', foo_pub2 => 'list2.2')
);
}
1;
# file test.pl
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Bar;
my $obj1 = new Bar;
$obj1->foo_pub1 = 1;
print $obj1->foo_pub1, "\n";
use Time::HiRes qw ( time );
my $s = 0;
my $t1=time;
foreach ( 1..10000 )
{
$s += $obj1->count;
}
print "time:",(time-$t1), "\n";
print "sum=$s\n";
$t1=time;
foreach ( 1..10000 )
{
my $obj1 = Bar->new;
}
print "time:",(time-$t1), "\n";
print Dumper($obj1);
my $r;
read STDIN, $r, 1;
print $r;
############################################################################
DESCRIPTION
Ambrosia::core::Object
is the abstract base class for classes that are created by Ambrosia::Meta.
CONSTRUCTOR
new
This method creates the new object of specified type. Input params is a hash or a reference to hash. The hash keys are the fields of the class that have been created by Ambrosia::Meta
_init
_init
is called from new
to initialize fields (include private and protected fields) of an object by input parameters. This method may be overriden in child class.
METHODS
fields
Returns public fields of class (include public fields of parent classes) that have been created by Ambrosia::Meta.
value
Returns values of specified public fields or values of all public fields if not stated.
string_dump
Returns the dump of the object as string to store. print $obj->string_dump()
string_restore($string_dump)
Static method of class (package). Restores the object from dump created early by method string_dump()
. my $obj = Ambrosia::core::Object::string_restore($obj->string_dump())
WARNING! When restoring an object from dump this method does not call _init
. Also see documentation in Data::Serializer.
as_hash ($error_ignore, @methods)
If $error_ignore
is true all errors occurred in this method will be ignored.
Returns the object as hash structure. You can also declare methods of class that will be called and their returned values will also be stored in hash.
Rule for declare methods. real_method_of_class:name_for_key_in_hash(params_for_method_split_by_comma){methods_of_returned_objects}
Or in BNF (in square brackets is optional): methods := method_declare[,methods] method_declare := method[{methods_of_class_of_returned_object}] method := real_name_of_method_in_class[:alias[(params)]] params := param[,params] #just any data methods_of_class_of_returned_object := methods #if method return reference to another object then you can present any methods of that result object and etc.
For example:
{
package Bar;
Ambrosia::Meta;
class
{
public => [qw/b1 b2/],
};
sub join
{
my $self = shift;
return $self->b1 . ';' . $self->b2;
}
1;
}
{
package Foo;
Ambrosia::Meta;
class
{
public => [qw/f1 f2 bar/],
};
sub m1
{
return 'method of m1 run with: ' . $_[1];
}
sub getBar
{
return $_[0]->bar;
}
sub dump
{
my $self = shift;
return $self->as_hash(1, 'm1:method1(123)', 'getBar{join}');
}
1;
}
copy_to ($dest)
Makes copy of the source object to the destination object (only public fields are copied). $source->copy_to($dest)
clone ($deep)
Makes clone of object. If $deep
is true it will create a deep clone. And vice versa if $deep
is false it will create a simple clone. If a field is a reference to some data then the field of simple clone will also refer to these data.
Note for deep clone: if any field is the reference to any object, this object will also be cloned but only if it has the method clone
as_xml ($document, $charset, $name, $error_ignore, @methods)
Converts the object to the XML Document (XML::LibXML::Document). Is called with the following params
- document
-
The xml document. Optional. If not defined, the document will be created.
- charset
-
Charset of xml document if it has not been defined. Optional. Default is 'utf8'.
- name
-
Name of root node. Optional. If not presented, the class name will be used.
- error_ignore ($bool)
-
True or false in perl notation (1 or 0). Optional. Default value is true. In the case of error and if
$bool
is true, the error will be ignored.item methods
Optional. See as_hash.
equal ($other_object, $deep, $identical)
Compares two objects. $object->equal($other_object, $deep, $identical); If $deep is true, deep compare will be executed. If $identical is true, only references of objects will be compared.
my $obj = new SomeObject();
my $ref = $obj;
my $obj2 = new SomeObject();
$obj->equal($ref,0,1); #is true
$obj->equal($obj2,0,1); #is false
$obj->equal($obj2); #is true
$obj->equal($obj2,1); #is true
DEPENDENCIES
XML::LibXML Data::Serializer Ambrosia::error::Exceptions Ambrosia::core::Nil
THREADS
Not tested.
BUGS
Please report bugs relevant to Ambrosia
to <knm[at]cpan.org>.
SEE ALSO
COPYRIGHT AND LICENSE
Copyright (C) 2010-2012 Nickolay Kuritsyn. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
AUTHOR
Nikolay Kuritsyn (knm[at]cpan.org)