Model-Envoy
view release on metacpan or search on metacpan
lib/Model/Envoy.pm view on Meta::CPAN
return $self->_plugin_instance('cache',$package);
}
}
sub in_storage {
my ( $self, $package ) = @_;
if( my $storage = $self->get_storage($package) ) {
return $storage->in_storage;
}
die "model does not use '$package' to persist data";
}
sub in_cache {
my ( $self, $package ) = @_;
if( my $storage = $self->get_storage($package) ) {
return $storage->in_storage;
}
die "model does not use '$package' to persist data";
}
sub build {
my( $class, $params, $no_rel ) = @_;
if ( ! ref $params ) {
return undef unless defined $params;
die "Cannot build a ". $class ." from '$params'";
}
elsif( ref $params eq 'HASH' ) {
return $class->new(%$params);
}
elsif( ref $params eq 'ARRAY' ) {
die "Cannot build a ". $class ." from an Array Ref";
}
elsif( blessed $params && $params->isa( $class ) ) {
return $params;
}
elsif( my $model = $class->_dispatch('build', $params, $no_rel ) ) {
return $model;
}
else {
die "Cannot coerce a " . ( ref $params ) . " into a " . $class;
}
}
sub save {
my $self = shift;
$self->_dispatch('save', @_ );
return $self;
}
sub update {
my ( $self, $hashref ) = @_;
foreach my $attr ( grep { $_->get_write_method } $self->_get_all_attributes ) {
my $name = $attr->name;
if ( exists $hashref->{$name} ) {
$self->$name( $hashref->{$name} );
}
}
return $self;
}
sub delete {
my ( $self ) = @_;
$self->_dispatch('delete', @_ );
return 1;
}
sub dump {
my ( $self ) = @_;
return {
map { $_ => $self->_dump_property( $self->$_ ) }
grep { defined $self->$_ }
map { $_->name }
$self->_get_all_attributes
};
}
sub _dump_property {
my ( $self, $value ) = @_;
return $value if ! ref $value;
return [ map { $self->_dump_property($_) } @$value ] if ref $value eq 'ARRAY';
return { map { $_ => $self->_dump_property( $value->{$_} ) } keys %$value } if ref $value eq 'HASH';
return $value->dump if $value->can('does') && $value->does('Model::Envoy');
if ( my $method = first { $value->can($_) } qw( stringify to_string as_string to_str ) ) {
return $value->$method;
}
return undef;
}
sub _get_all_attributes {
my ( $self ) = @_;
return grep { $_->does('Envoy') } $self->meta->get_all_attributes;
}
( run in 0.676 second using v1.01-cache-2.11-cpan-437f7b0c052 )