ArangoDB2
view release on metacpan or search on metacpan
lib/ArangoDB2/Base.pm view on Meta::CPAN
package ArangoDB2::Base;
use strict;
use warnings;
use Carp qw(croak);
use Data::Dumper;
use JSON::XS;
use Scalar::Util qw(blessed weaken);
# new
#
# Arango organizes data hierarchically: Databases > Collections > Documents
#
# This constructor can build ArangoDB2::Database, Collection, Document, Edge,
# etc. objects which all follow the same pattern
sub new
{
my $class = shift;
# new instance
my $self = {};
bless($self, $class);
# process args
while (my $arg = shift) {
# if arg is a ref it should be another
# ArangoDB::* object
if (ref $arg) {
# prevent circular ref
weaken $arg;
# create reference to parent object
$self->{$arg->_class} = $arg;
}
# if arg is a string then it is the "name"
# of this object
else {
$self->name($arg);
}
}
# if we have a name and can get then try it
$self->get if defined $self->name
and $self->can('get');
return $self;
}
# api_path
#
# return /_db/<db name>/_api
sub api_path
{
my $self = shift;
my $db_name
= $self->database
? $self->database->name
: $self->name;
return '/' . join('/', '_db', $db_name, '_api', @_);
}
# arango
#
# ArangoDB2 instance
sub arango { $_[0]->{arango} }
# collection
lib/ArangoDB2/Base.pm view on Meta::CPAN
$params ||= $self->_params;
# copy params
for my $param (@$params) {
$self->{$param} = delete $data->{$param}
if exists $data->{$param};
}
# copy _id and _rev to id/rev
$self->{id} = delete $data->{_id}
if exists $data->{_id};
$self->{rev} = delete $data->{_rev}
if exists $data->{_rev};
# if user is set then use it as name
if (exists $data->{user}) {
$self->{name} = delete $data->{user};
}
# otherwise try _key
elsif (exists $data->{_key}) {
$self->{name} = delete $data->{_key}
}
# copy to and from
$self->{from} = delete $data->{_from}
if exists $data->{_from};
$self->{to} = delete $data->{_to}
if exists $data->{_to};
return $self;
}
# _get_set
#
# either get or set value.
# setting value returns self.
sub _get_set
{
my($self, $param, $value, $validate) = @_;
if (defined $value) {
# if we are only validating then return valid value
return $value if $validate;
# set value and return self
$self->{$param} = $value;
return $self;
}
else {
# return currently set value
return $self->{$param};
}
}
# _get_set_bool
#
# either get value or set JSON bool value.
# setting value returns self.
sub _get_set_bool
{
my($self, $param, $value, $validate) = @_;
if (defined $value) {
# accept "true" as JSON bool false
if ($value eq "true") {
$value = JSON::XS::true;
}
# accept "false" as JSON bool false
elsif ($value eq "false") {
$value = JSON::XS::false;
}
# use the true/false of value to determine JSON bool
else {
$value = $value ? JSON::XS::true : JSON::XS::false;
}
# if we are only validating then return valid value
return $value if $validate;
# set value and return self
$self->{$param} = $value;
return $self;
}
else {
# return currently set value
return $self->{$param};
}
}
# _get_set_id
#
# get/set id with either string or object
# setting a value returns self
sub _get_set_id
{
my($self, $param, $value, $validate) = @_;
if (defined $value) {
# get value from an ArangoDB2 object
if ( blessed $value && $value->can('id') ) {
$value = $value->id
}
# if we are only validating then return valid value
return $value if $validate;
# set value and return self
$self->{$param} = $value;
return $self;
}
else {
# return currently set value
return $self->{$param};
}
}
# _get_set_name
#
# get/set name with either name or object
# setting a value returns self
sub _get_set_name
{
my($self, $param, $value, $validate) = @_;
if (defined $value) {
# get value from an ArangoDB2 object
if ( blessed $value && $value->can('name') ) {
$value = $value->name
}
# if we are only validating then return valid value
return $value if $validate;
# set value and return self
$self->{$param} = $value;
return $self;
}
else {
# return currently set value
return $self->{$param};
( run in 0.740 second using v1.01-cache-2.11-cpan-39bf76dae61 )